Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Fahrstuhlsimulator - Erstellen von Wartenden


maxet - Do 06.12.12 15:58
Titel: Fahrstuhlsimulator - Erstellen von Wartenden
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:


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)


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 - Do 06.12.12 21:10

Hallo,

ich sehe keinen klaren Fehler, aber ich glaube, die Zählweise ist wohl nicht richtig.
Ich würde schreiben:

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 - Do 06.12.12 21: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 - Fr 07.12.12 10: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 - Sa 08.12.12 13: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 - Sa 08.12.12 15: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 - So 09.12.12 16: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 - So 09.12.12 16: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 - Mo 10.12.12 12: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.

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.


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 - Mo 10.12.12 17: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 - So 20.01.13 16: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