PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi: Finde Fehler im Prog nicht


mobius
2005-05-14, 21:25:31
Hallo könnte vielleicht mal jemand gucken, ob er verstehen kann was der Fehler ist? Irgendwie blick ich grad net durch. Hab die Fehlerzeilen mal Fett markiert. Danke für die Mühe.

Skelet_L.pas
unit Skelett_L;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;

type
TForm1 = class(TForm)
M1: TMemo;
P1: TPanel;
P2: TPanel;
procedure FormCreate(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses USpiel_L, UDialog1;

VAR AnfangsSituation, EndSituation : tSituation;

// *****************************************************************************
// Spielbeschreibung (nennt auf Wunsch die Spielregeln)
// *****************************************************************************

PROCEDURE Spielbeschreibung;
var i : Integer;
BEGIN
if Application.MessageBox('Spielbeschreibung anzeigen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
begin
Form1.Caption := spielname; {in USpiel_L deklariert}
Form1.M1.Lines.LoadFromFile('Spielbeschreibung.txt');
if Application.MessageBox('Mit dem Spiel beginnen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
for i := 0 to 14 do Form1.M1.Lines[i] := ''; //Zeilen mit Index niedriger als Txt werden nicht angezeigt
end;
END;

// *****************************************************************************
// Vorbereitungen (setzt generelle Anfangsbedingungen)
// *****************************************************************************

PROCEDURE Vorbereitungen;

PROCEDURE Namenseingabe; {Eingabe der Spielernamen}
BEGIN
spname[erster] := InputBox('Eingabe',
'Name des ersten Spielers?', '');
Form1.P1.Caption := Form1.P1.Caption + spname[erster];
spname[zweiter] := InputBox('Eingabe',
'Name des zweiten Spielers?', '');
Form1.P2.Caption := Form1.P2.Caption + spname[zweiter];
spname[keiner] := 'Keiner';
END;

BEGIN
Namenseingabe;
randomize;
Voreinstellungen {in USpiel_L deklariert}
END;

// *****************************************************************************
// Startangaben (legt Startposition und anziehenden Spieler fest)
// *****************************************************************************

PROCEDURE Startangaben (VAR situation: tSituation);
VAR antwort : char;
hilf : String;
BEGIN
WITH situation DO
BEGIN
Anfang(pos); {in USpiel_L deklariert}
hilf := InputBox('Eingabe',
'Wer fängt an: ' + spname[erster] +
' oder ' + spname[zweiter] + '? (1/2) ', '');
antwort := hilf[1];
CASE antwort OF
'1' : am_Zug := erster;
'2' : am_Zug := zweiter
END
END
END;

// *****************************************************************************
// Partie (das eigentliche Spielgeschehen)
// *****************************************************************************

PROCEDURE Partie (start: tSituation; VAR ziel: tSituation);
VAR situation, neuSituation : tSituation;

PROCEDURE Uebergang (alt: tSituation; VAR neu: tSituation);
VAR zug : tZug;

PROCEDURE spieler_zieht (sit: tSituation; VAR zug: tZug); {der Zug}
VAR korrekt : boolean; {des Spielers}
BEGIN {wird eingelesen}
REPEAT {und geprüft}
Eingabe(zug, sit); {in USpiel_L deklariert}
korrekt := zulaessig(zug, sit); {in USpiel_L deklariert}
IF NOT korrekt
THEN MessageDlg('Der Zug ist nicht zulässig!',
mtWarning, [mbOK], 0);
UNTIL korrekt
END;

BEGIN {Übergang}
spieler_zieht(alt, zug);
ausgefuehrt(pos, alt, z, neu) //Zeile 117
END;

BEGIN {Partie}
situation := start;
REPEAT
Ausgabe(pos); //Zeile 123
Uebergang(situation, neuSituation);
situation := neuSituation
UNTIL Ende(pos); //Zeile 126
ziel := situation
END;

// *****************************************************************************
// Endinformation (informiert über den Ausgang der Partie)
// *****************************************************************************

PROCEDURE Endinformation (sit: tSituation);
BEGIN
Ausgabe(pos); //Zeile 136
MessageDlg(spname[sit.am_Zug] + ' hat gewonnen.', mtInformation, [mbOK], 0)
END;


// *****************************************************************************
// Schluss (prüft, ob die Spieler genug haben)
// *****************************************************************************

FUNCTION Schluss: boolean;
VAR antwort : char;
hilf : String;
BEGIN
repeat
hilf := InputBox('Eingabe', 'Noch eine Partie? (j/n)', '');
until hilf > '';
antwort := hilf[1];
Schluss := antwort IN ['n', 'N']
END;

// *****************************************************************************
// Spielende (der Computer empfiehlt sich)
// *****************************************************************************

PROCEDURE Spielende;
BEGIN
MessageDlg('Ende des Spiels ' + spielname + '.', mtInformation, [mbOK],0);
END;

// *****************************************************************************
// Hauptprogramm
// *****************************************************************************

procedure TForm1.FormCreate(Sender: TObject);
begin
Show;
Spielbeschreibung;
Vorbereitungen;
REPEAT
Startangaben(AnfangsSituation);
Partie(AnfangsSituation, EndSituation);
Endinformation(EndSituation)
UNTIL Schluss;
Spielende;
end;

end.

Fehlerprotokoll:
[Fehler] Skelett_L.pas(117): '(' erwartet, aber ',' gefunden
[Fehler] Skelett_L.pas(117): Anweisung erforderlich, aber Ausdruck vom Typ 'tSituation' gefunden
[Fehler] Skelett_L.pas(123): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(126): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(136): '(' erwartet, aber ')' gefunden
[Fataler Fehler] Rahmen_L.dpr(7): Verwendete Unit 'Skelett_L.pas' kann nicht compiliert werden

UNIT USpiel_L;

INTERFACE

USES
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;

CONST
spielname = 'Die Wandernden Steine';

TYPE
tSteinindex = 1..4;
tFeldindex = Integer;
tPosition = Array[tSteinindex] of tFeldindex;
tSpieler = (erster, zweiter, keiner);
tSituation = record
pos : tPosition;
am_Zug : tSpieler;
end;
tZug = Record
stein : tSteinindex;
zielfeld : tFeldindex;
end;
VAR
spname : array[tSpieler] of String;
//maxSteinanzahl := Integer;

PROCEDURE Voreinstellungen;
PROCEDURE Anfang (VAR pos: tPosition);
PROCEDURE Ausgabe (position: tPosition);
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
FUNCTION Ende (VAR pos: tPosition): boolean;

implementation

uses Skelett_L, UDialog1;

CONST
gegner : ARRAY[tSpieler] OF tSpieler = (zweiter, erster, keiner);

PROCEDURE Voreinstellungen;
BEGIN
//maxSteinanzahl := StrToInt(InputBox('Eingabe', 'Maximale Steinanzahl: ', ''));
//maxSteinanzahl:=4;
END;
//!
PROCEDURE Anfang (VAR pos: tPosition); {legt Anfangsposition fest}
BEGIN
Randomize;
{ pos[1]:=1+Random(10);
pos[2]:=1+Random(10);
While pos[2]=pos[1] do Pos[2]:=1+Random(10);
pos[3]:=1+Random(10);
While (pos[3]=pos[1]) OR (pos[3]=pos[2]) do Pos[3]:=1+Random(10);
pos[4]:=1+Random(10);
While (pos[4]=pos[1]) OR (pos[4]=pos[2]) OR (pos[4]=pos[3]) do Pos[4]:=1+Random(10); }
pos[1]:=3; pos[2]:=4; pos[3]:=8; pos[4]:=11;
//Form1.M1.Lines[1] := '..OO...O..O....';
END;
//!
PROCEDURE Ausgabe;
BEGIN
Form1.M1.Lines[1] := 'Der 1. Stein befindet sich auf Position '+IntToStr(position[1])+'.';
Form1.M1.Lines[2] := 'Der 2. Stein befindet sich auf Position '+IntToStr(position[2])+'.';
Form1.M1.Lines[3] := 'Der 3. Stein befindet sich auf Position '+IntToStr(position[3])+'.';
Form1.M1.Lines[4] := 'Der 4. Stein befindet sich auf Position '+IntToStr(position[4])+'.';
END;
//!
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
CONST
frage = 'Welcher Stein soll bewegt werden ';
VAR
antwort : char;
BEGIN
//lies_Zeichen(frage + spname[sit.am_Zug] + '?', antwort, ['1'..'4']);
//zug.stein := ord(antwort) - ord('0');
zug.stein := StrToInt(InputBox('Eingabe', 'Welcher Stein soll bewegt werden? ', ''));
zug.zielfeld := StrToInt(InputBox('Eingabe', 'Wo soll der Stein plaziert werden? ', ''));
END;
//!
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
var stein : tSteinindex;
BEGIN
zulaessig:=false;
IF zug.stein=1 Then
IF NOT ((0<zug.zielfeld) AND (zug.zielfeld<sit.pos[1])) THEN exit;
For stein:=2 to 4 do
If NOT ((sit.pos[stein-1]<zug.zielfeld) AND (zug.zielfeld<sit.pos[stein])) THEN exit;
zulaessig:=true;
END;

PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
BEGIN
//neu.pos := alt.pos - z;
pos[z.stein]:=z.zielfeld;
neu.am_Zug := gegner[alt.am_Zug];
END;
//!
FUNCTION Ende (VAR pos: tPosition): boolean;
BEGIN
if (pos[1]=1) AND (pos[2]=2) AND (pos[3]=3) AND (pos[4]=4) THEN
begin
Result := true;
//situation.am_Zug := gegner[situation.am_Zug];
end
else Result := false;
END;

end.

Darkstar
2005-05-15, 11:35:58
Du verwendest pos, was aber nirgends als Variable deklariert ist. Deswegen vermutet der Compiler, es ist die Funktion Pos gemeint, die allerdings einige Übergabeparameter benötigt.

Hinweis: Wenn möglich, sollte man Variablen nicht wie Funktionen benennen. Sinnvoll ist es beispielsweise, sich bei der Benennung von Variablen der ungarischen Notation (http://de.wikipedia.org/wiki/Ungarische_Notation) zu bedienen.

Coda
2005-05-15, 12:30:29
hungarian notation *würg*

Nene, lieber ne gescheite IDE, die einem sowas anzeigt, bevor man sich den Murks antut.

Ganon
2005-05-15, 12:46:07
hungarian notation *würg*
Nene, lieber ne gescheite IDE, die einem sowas anzeigt, bevor man sich den Murks antut.

Jups. Aber die Variablennamen sollte man schon "intelligent" auswählen.

Sonst hat man nachher sowas:

---
String a;
Vector b;
File c;

.
. // 500 Zeilen Code
.

b.add(c.list(a))
---

Da möchte ich schon etwas mehr "Einsicht", ohne darauf warten zu müssen das die IDE alles zusammengesucht hat.

mobius
2005-05-15, 18:48:26
Du verwendest pos, was aber nirgends als Variable deklariert ist. Deswegen vermutet der Compiler, es ist die Funktion Pos gemeint, die allerdings einige Übergabeparameter benötigt.

Danke das funktioniert. Jetz hätte ich nur noch ein Problem:

Hab jetz mal die Stelle der Startangaben des Spiels markiert. In dieser Prozedur wird in Erfahrung gebracht wo die Anfangsspielsteine stehen. Das definiere ich in der Prozedur Anfang. Die Werte werden zwar korrekt eingetragen (hab ich per Debugger nachgeguckt), aber nachdem die Prozedur verlassen wird steht da:
"pos[1]: Symbol wurde vom Linker entfernt"
Bei der Ausgabe sind die Werte dann 0. Weiss jemand warum?

P.s. wegen den Variablennamen... ist leider ein Projekt wo der ganze Rahmen vorgegeben ist, hab da wenig Einfluss drauf.

Skelet_L.pas
unit Skelett_L;

...

PROCEDURE Startangaben (VAR situation: tSituation);
VAR antwort : char;
hilf : String;
pos : tPosition;
BEGIN
WITH situation DO
BEGIN
Anfang(pos); {in USpiel_L deklariert}
hilf := InputBox('Eingabe',
'Wer fängt an: ' + spname[erster] +
' oder ' + spname[zweiter] + '? (1/2) ', '');
antwort := hilf[1];
CASE antwort OF
'1' : am_Zug := erster;
'2' : am_Zug := zweiter
END
END
END;

...

// *****************************************************************************
// Hauptprogramm
// *****************************************************************************

procedure TForm1.FormCreate(Sender: TObject);
begin
Show;
Spielbeschreibung;
Vorbereitungen;
REPEAT
Startangaben(AnfangsSituation);
Partie(AnfangsSituation, EndSituation);
Endinformation(EndSituation)
UNTIL Schluss;
Spielende;
end;

end.

Fehlerprotokoll:


UNIT USpiel_L;

...

TYPE
tSteinindex = 1..4;
tFeldindex = Integer;
tPosition = Array[tSteinindex] of tFeldindex;
tSpieler = (erster, zweiter, keiner);
tSituation = record
pos : tPosition;
am_Zug : tSpieler;
end;
tZug = Record
stein : tSteinindex;
zielfeld : tFeldindex;
end;
VAR
spname : array[tSpieler] of String;
//maxSteinanzahl := Integer;

PROCEDURE Voreinstellungen;
PROCEDURE Anfang (VAR pos: tPosition);
PROCEDURE Ausgabe (position: tPosition);
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
FUNCTION Ende (VAR pos: tPosition): boolean;

implementation

uses Skelett_L, UDialog1;

...

PROCEDURE Anfang (VAR pos: tPosition); {legt Anfangsposition fest}
BEGIN
pos[1]:=3;
pos[2]:=4;
pos[3]:=8;
pos[4]:=11;
END;

...

[/QUOTE]

Coda
2005-05-15, 19:06:59
Da möchte ich schon etwas mehr "Einsicht", ohne darauf warten zu müssen das die IDE alles zusammengesucht hat.Mal ehrlich, hälst du mich für so beschränkt? X-D

mobius
2005-05-16, 00:48:21
Keiner ne Idee für mein zweites Problem?

Darkstar
2005-05-16, 10:38:50
Die Variable pos ist in der Prozedur Startangaben lokal deklariert. Nach dem Verlassen der Prozedur gibt es diese Variable nicht mehr. Vermutlich ist noch eine global deklarierte pos-Variable vorhanden, deren Inhalt der Debugger dann anzeigt.

Ganon
2005-05-16, 22:32:23
Mal ehrlich, hälst du mich für so beschränkt? X-D

*ggg*

Kannst du keinen Spaß ab? ;)