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.
Delphi_Fehler

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..3of Integer;
          end;

Lager = Array[1..5of 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);

//Aufgabe 3b)
writeln('Kontrolle:');
for i:= 1 to 5 do
begin
  Ausgabe(Regal[i]);
end;

//Aufgabe 3c)
writeln('Gesamtwert des Regals: ', Gesamtwert(Regal):5:2);

writeln('');


end;


Ich hoffe das ihr mir helfen könnt.

Moderiert von user profile iconNarses: 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..3of Integer;
          end;

Lager = Array[1..5of 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..3of integer;
                      end;
Lager=array[1..5of Bauteil;
var Regal:Lager;
    i:integer;
    x:string;

begin
//Daten der Bauteile einlesen(a)
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 user profile iconGausi: 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!