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; 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
maxet hat folgendes geschrieben : |
| 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
Gerd Kayser hat folgendes geschrieben : |
| 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
maxet hat folgendes geschrieben : |
| 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; 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 a:=trunc(random*2* 30 / 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; 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!