Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - read() fehler
Semptic - Di 08.12.09 12:10
Titel: read() fehler
Guten Morgen beisammen,
ich hab folgendes Problem, und zwar überspringt mein Programm den read Befehl ( read(Regal[i].Name), Zeile 48) nach dem ersten Durchlauf jedes mal (also 4 mal), als ob ich nichts Eingeben und Enter drücken würde.
Hier ein bild wie es aussieht.
Hier mal der ganze Quellentext der damit was zu tun hat (Der teil in dem der Fehler stecken muss Zeile 44-69):
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: 77: 78: 79: 80: 81: 82: 83: 84:
| TYPE Bauteil = record Name: String[5]; Nummer: Integer; Stueck: Integer; Preis: Real; Lieferdatum: Array[1..3] of Integer; end;
Lager = Array[1..5] of Bauteil;
procedure TForm_Leistungsnachweis.Button_Aufgabe_03Click(Sender: TObject); Var Regal:Lager; i: Integer;
procedure Ausgabe(bauteil: Bauteil); begin writeln('Name: ', bauteil.Name:5, ' Nummer: ', bauteil.Nummer:5, ' Stueckzahl: ', bauteil.Stueck:3, ' Preis: ', bauteil.Preis:5:2, ' Lieferdatum: ', bauteil.Lieferdatum[1], '.', bauteil.Lieferdatum[2], '.', bauteil.Lieferdatum[3]); end;
function Gesamtwert(Regal: Lager):real; var Summe: Real; i: Integer; begin Summe := 0; for i:= 1 to 5 do begin Summe := Summe + Regal[i].Stueck*Regal[i].Preis; end; result := Summe; end;
begin writeln('Bestueckung eines Regals mit Waren'); writeln('');
i:= 1; repeat writeln('Ware ', i, ':');
write('Name: '); read(Regal[i].Name);
write('Nummer: '); read(Regal[i].Nummer);
write('Stueckzahl: '); read(Regal[i].Stueck);
write('Preis: '); read(Regal[i].Preis);
writeln('Lieferdatum':15); write('Tag: '); read(Regal[i].Lieferdatum[1]); write('Monat: '); read(Regal[i].Lieferdatum[2]); write('Jahr: '); read(Regal[i].Lieferdatum[3]);
writeln(''); i := i+1; until (i > 5);
writeln('Kontrolle:'); for i:= 1 to 5 do begin Ausgabe(Regal[i]); end;
writeln('Gesamtwert des Regals: ', Gesamtwert(Regal):5:2);
writeln('');
end; |
Ich hoffe das ihr mir helfen könnt.
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
ffgorcky - Di 08.12.09 13:56
Herzlich willkommen im Delphi-Forum!
Also erst mal nur so als Frage:
Dein Regal ist vom Typ Lager - und Dein Lager ist einfach nur ein Array, oder was ist das?
Es wäre also schön, wenn Du uns das mal genauer darstellst.
Semptic - Di 08.12.09 14:33
Sorry des hab ich beim Kopieren übersehen, habs editiert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| TYPE Bauteil = record Name: String[5]; Nummer: Integer; Stueck: Integer; Preis: Real; Lieferdatum: Array[1..3] of Integer; end;
Lager = Array[1..5] of Bauteil; |
Gammatester - Di 08.12.09 15:00
Nimm mal readln statt read. Wahrscheinlich ist das Problem dann weg. Read wird von Konsole nur in ganz seltenene Fällen gebraucht.
Gruß Gammatester
Semptic - Mi 09.12.09 15:07
Erstmal danke für die schnelle Hilfe und auch danke denn genau das war der Fehler.
Super bin echt Happy, denn auf des währ ich selber nich gekommen.
McDanielz - Fr 11.12.09 12:04
So Hallo erstmal. Ich muss genau die gleiche Aufgabe lösen, doch bei mir klappt das trotz readln befehl nicht
hier mein qelltext:
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:
| procedure TForm1.Button1Click(Sender: TObject); type Bauteil=record Name:string[5]; Nummer:integer; Stueck:integer; Preis:real; Lieferdatum:array[1..3] of integer; end; Lager=array[1..5] of Bauteil; var Regal:Lager; i:integer; x:string;
begin for i:=1 to 5 do begin writeln('Bauteil Nr',i); write('Name:'); readln(x); write('Nummer:'); readln(Regal[i].Nummer); write('Stueck:'); read(Regal[i].Stueck); write('Preis:'); read(Regal[i].Preis); writeln('Lieferdatum:'); write('Tag:'); read(Regal[i].Lieferdatum[1]); write('Monat:'); read(Regal[i].Lieferdatum[2]); write('Jahr:'); read(Regal[i].Lieferdatum[3]); end; end; |
weder mit read noch mit readln funktionierts. ab dem 2. durchlauf wird der readbefehl übersprungen. Das muss irgendwie an dem stringtyp liegen, denn die integertypen werden nicht übersprungen. Aber warum funktioniert das beim ersten Durchgang?
P.S. Wie lustig dass jemand aus meinem Studiengang hier genau das gleiche gefragt hat. :D
Moderiert von
Gausi: Delphi-Tags hinzugefügt
McDanielz - Fr 11.12.09 12:09
Ok es funktioniert wenn man alle read befehle durch readln ersetzt. Trotzdem hätte ich gerne eine Erklärung dafür.
Danke!
Gammatester - Fr 11.12.09 13:16
Die Onlinehilfe ist nicht nur dazu da, daß die Installationspakete größer werden (Hervorhebung von mir):
Delphi 6:
| Zitat: |
With a type string variable:
Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes True; it does not skip to the next line after reading. If the resulting string is longer than the maximum length of the string variable, it is truncated.
After the first Read, each subsequent Read sees the end-of-line marker and returns a zero-length string. |
Oder wenn's auf Deutsch besser gefällt, hier die von Borland Pascal:
| Zitat: |
Bei einer Stringvariablen:
Read liest alle Zeichen bis auschließlich der nächsten Zeilenendemarkierung oder bis Eof(f) True ist. Nach dem Lesen geht Read nicht zur nächsten Zeile. Ist der gelesene String länger als die String-Variable, wird er abgeschnitten.
Read überspringt das Zeilenende nicht. Nach dem ersten Read stößt also jedes folgende Read auf das Zeilenende und gibt einen String der Länge 0 zurück. |
Gruß Gammatester
McDanielz - Fr 11.12.09 13:27
Vielen Dank!
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!