Autor Beitrag
maxet
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 06.12.12 16:58 
Hey Leute,

ich komme einfach mit der im Titel bereits angesprochenen Problematik nicht weiter.
Ich bin gerade dabei, einen Fahrstuhlsimulator zu schreiben, und dafür habe ich jeweils maximal 30 Wartende an 9 Stockwerken.

Nun lasse ich mir die Wartenden mit einer Prozedur erstellen, d.h. die Werte des Wartenden-Objekts werden festgelegt.
Das Objekt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Leute=object
aktiv:boolean;
akst:integer; //AKtuelles STockwerk
ziel:integer;
Gewicht:integer;
zeitdruck:boolean;
prioritaeten:boolean;
end;


Für jedes Stockwerk sollen nun bei Aufrufen der Prozedur die nächsten a:=random(3)+1 Wartende als aktiv gesetzt werden.
Nun beachtet das Programm aber weder den Wert von a, noch die mit einer If-Anweisung am Anfang geschriebene Bedingung, dass es pro Stockwerk maximal! 30 Wartende geben darf.
Im Folgenden mal der Quelltext von der Prozedur zum Erstellen der Wartenden... (Sorry für die wahrscheinlich falschen Enrückungen)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure passengercreate;
var i,j,a:integer;
begin
for i:=0 to 8 do
  begin
  a:=random(3)+1;
  if (lastnumber[i]+1+a)<=30 then
    begin
    for j:=lastnumber[i]+1 to lastnumber[i]+1+a do
      begin
      with stockwerkwartende[i,j] do
        begin
        akst:=i;
        aktiv:=true;
        repeat ziel:=random(9); until not (ziel=i);
        Gewicht:=random(80)+20;
        if a>2 then
          begin
          zeitdruck:=true;
          prioritaeten:=true
        end
        else
          begin
          zeitdruck:=false;
          prioritaeten:=false;
        end;
        lastnumber[i]:=lastnumber[i]+2+a;
      end;
    end;
  end;
end;
end;


Soo, das war mein Hauptproblem. Wenn ich das lösen kann, bin ich schon sehr weit.
Ich hoffe, ihr findet raus, was ich wahrscheinlich übersehe. :lupe:

LG
maxet
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 06.12.12 22:10 
Hallo,

ich sehe keinen klaren Fehler, aber ich glaube, die Zählweise ist wohl nicht richtig.
Ich würde schreiben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure passengercreate;
  begin
....
  a:=random(3)+1;
  if (lastnumber[i]+a)<=30 then
    begin
    for j:=lastnumber[i]+1 to lastnumber[i]+a do
      begin
        ...   
        lastnumber[i]:=lastnumber[i]+a;
      end;
    end;
  end;


Das kann zwar Deinen Fehler nicht erklären, aber hilft vielleicht trotzdem.
Was bedeutet in Deiner Frage ".. beachtet nicht..."? Wird der Code auch für > 30 ausgeführt? Wird a nicht berechnet? Setze doch einmal einen Break auf die IF Abfrage und siehe Dir a.

Gruß GuaAck
maxet Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 06.12.12 22:53 
Hey GuaAck,

Danke erstmal für deine schnelle Antwort. Wenn ich genau nachdenke, müsste die Schleife mit deinem Vorschlag richtig funktionieren, wenn ich Glück habe, dann löst das mein Problem sogar. Ich probier das auf jeden Fall noch morgen aus.

Grüße
maxet
Serbsis
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 07.12.12 11:44 
Hallo, hat es denn so geklappt? Für mich sieht das nämlich auch alles ziemlich richtig aus, was du da geschrieben hast!
maxet Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 08.12.12 14:21 
Hey,

es klappt immer noch nicht. Das "beachtet nicht" meint, dass die Prozedur mehr als 30 Wartende erstellt, also die Grenze von maximal 30 Wartenden am Stockwerk nicht funktioniert. Hmmm.. :autsch:

Lg
maxet
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 08.12.12 16:31 
user profile iconmaxet hat folgendes geschrieben Zum zitierten Posting springen:
Das "beachtet nicht" meint, dass die Prozedur mehr als 30 Wartende erstellt, also die Grenze von maximal 30 Wartenden am Stockwerk nicht funktioniert.

LastNumber[i] enthält wohl die Anzahl der Wartenden je Stockwerk. Du addierst immer nur Zahlen hinzu ( lastnumber[i]:=lastnumber[i]+2+a; ), aber nirgends sehe ich, daß Du etwas von der Variablen subtrahierst oder sie auf 0 setzt.
maxet Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 09.12.12 17:12 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Du addierst immer nur Zahlen hinzu ( lastnumber[i]:=lastnumber[i]+2+a; ), aber nirgends sehe ich, daß Du etwas von der Variablen subtrahierst oder sie auf 0 setzt.

Falls du meinst, dass die Anzahl der Wartenden pro Stockwerk dekrementiert werden sollte, dann muss ich erklären, dass dies mit einer separaten Prozedur geregelt wird. Die Werte von lastnumber setzte ich nicht auf 0, ich habe mir diese Arbeit doch durch den Array gespart, der für jedes Stockwerk einen lastnumber-Wert hat. Warum sollte ich den denn zurücksetzen?
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: So 09.12.12 17:59 
user profile iconmaxet hat folgendes geschrieben Zum zitierten Posting springen:
dass dies mit einer separaten Prozedur geregelt wird.

Wenn die Anzahl der Wartenden die Zahl 30 übersteigt, funktioniert das offensichtlich nicht. Da wirst Du wohl debuggen und Dir den Inhalt der Variablen anzeigen lassen müssen, um den Fehler zu finden.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 10.12.12 13:13 
Hallo,

Zitat:

Ich bin gerade dabei, einen Fahrstuhlsimulator zu schreiben, und dafür habe ich jeweils maximal 30 Wartende an 9 Stockwerken.

Dein Lastnumber ergibt doch gar keinen Sinn.
Soll es die Anzahl der Wartenden bis zu diesem Stockwerk darstellen, dann stünde es außerhalb der for j Schleife.So addierst mehrfach etwas.
Die j-Schleife müßte sich auch Lastnumber[i-1] beziehen.
Dieses Feld braucht man dort aber ohnehin nicht.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
program Fahrstuhl;
{$IFDEF DELPHI}
  {$Apptype Console}
{$ENDIF}

uses
  sysutils,crt;
type
   tLeute=object
           aktiv:boolean;
           akst:integer; //AKtuelles STockwerk
           ziel:integer;
           Gewicht:integer;
           zeitdruck:boolean;
           prioritaeten:boolean;
        end;
const
  AnzahlEtagen = 9;
  AnzahlMaxWartende = 30;
var
  Lastnumber : array[0..AnzahlEtagen] of integer;
  stockwerkwartende: array[0..AnzahlEtagen,0..AnzahlMaxWartende] of tLeute;

procedure passengercreate;
var i,j,a,BisherWartende :integer;
begin

BisherWartende := 0;
for i:=0 to AnzahlEtagen-1 do
  begin
  // 30 Wartende auf 9 Etagen
  // Zufall ist im Mittel in der Mitte , deshalb die 2, ich lasse auch 0 Wartende zu
  a:=trunc(random*230 / 9) ;

  if (BisherWartende+a) <=30 then
    begin
    BisherWartende := BisherWartende +a;
    For j := 1 to a do
      begin
      with stockwerkwartende[i,j] do
        begin
        akst:=i;
        aktiv:=true;
        repeat ziel:=random(9); until not (ziel=i);
        Gewicht:=random(80)+20;
        if a>2 then
          begin
          zeitdruck:=true;
          prioritaeten:=true
          end
        else
          begin
          zeitdruck:=false;
          prioritaeten:=false;
          end;
        end;
      end;
    end
   else
     a:= 0;// Nur wegen der Ausgabe

  writeln('Stockwerk: ',i+1:2,' dort Wartende: ',a,' Bisher Wartende: ',BisherWartende:2);
  LastNumber[i] := BisherWartende;
  end;

end;

BEGIN
 randomize;
 repeat
   passengercreate;
   writeln;writeln;
   delay(2000);
 until keypressed;
 readln;
END.


So hast Du im Mittel 30 Wartende, wenn Du nicht auf 30 begrenzen würdest.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Stockwerk:  1 dort Wartende: 3 Bisher Wartende:  3
Stockwerk:  2 dort Wartende: 4 Bisher Wartende:  7
Stockwerk:  3 dort Wartende: 4 Bisher Wartende: 11
Stockwerk:  4 dort Wartende: 4 Bisher Wartende: 15
Stockwerk:  5 dort Wartende: 0 Bisher Wartende: 15
Stockwerk:  6 dort Wartende: 4 Bisher Wartende: 19
Stockwerk:  7 dort Wartende: 4 Bisher Wartende: 23
Stockwerk:  8 dort Wartende: 5 Bisher Wartende: 28
Stockwerk:  9 dort Wartende: 0 Bisher Wartende: 28


Stockwerk:  1 dort Wartende: 1 Bisher Wartende:  1
Stockwerk:  2 dort Wartende: 0 Bisher Wartende:  1
Stockwerk:  3 dort Wartende: 6 Bisher Wartende:  7
Stockwerk:  4 dort Wartende: 4 Bisher Wartende: 11
Stockwerk:  5 dort Wartende: 1 Bisher Wartende: 12
Stockwerk:  6 dort Wartende: 5 Bisher Wartende: 17
Stockwerk:  7 dort Wartende: 6 Bisher Wartende: 23
Stockwerk:  8 dort Wartende: 5 Bisher Wartende: 28
Stockwerk:  9 dort Wartende: 2 Bisher Wartende: 30


Ich vermute die Verwendung von Lastnumber als Ersatz für eine lineare Liste für stockwerkwartende.
Dann wäre die Wartenden in einer Liste/ array und Lastnumber[i-1]+1 bis Lastnumber[i] wären die Indizes der am Stockwerke i Wartenden. Dann bräuchte man kein stockwerkwartende[i,j] sondern nur stockwerkwartende[j] mit j von 0..30

Gruß Horst
maxet Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 10.12.12 18:24 
Okay, ich glaube da liegt ein Missverständnis vor. Lastnumber sollte angeben, wie viele Wartenden bereits im aktuellen Stockwerk stehen. Damit ist es ja das selbe wie wartende[i], das genau das bei meinem Programm angibt. Trotzdem, ich habe die Prozedur einmal neu geschrieben, doch dann hat sich das ganze Programm aufgehängt. Ich werde mich da noch mal vorsetzen und gebe dann Rückmeldung.
maxet Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 20.01.13 17:32 
Okay, das Problem hat sich dadurch gelöst, dass ich die Prozedur neu geschrieben habe. Woran es lag, weiss ich nicht ... Egal, hauptsache es funktioniert :D