Autor Beitrag
Semptic
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 08.12.09 12:10 
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):

ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Semptic am Di 08.12.09 14:33, insgesamt 1-mal bearbeitet
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 08.12.09 14:33 
Sorry des hab ich beim Kopieren übersehen, habs editiert.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:

ausblenden volle Höhe 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 11.12.09 13:27 
Vielen Dank!