Autor |
Beitrag |
maxet
Hält's aus hier
Beiträge: 14
|
Verfasst: 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:
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)
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.
LG
maxet
|
|
GuaAck
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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..
Lg
maxet
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Sa 08.12.12 16: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 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 09.12.12 17: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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: So 09.12.12 17: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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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.
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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 
|
|