Autor |
Beitrag |
Taddel93
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 19:30
Guten Abend zusammen,
ich habe folgendes Problem:
Wir sollen für die Schule ein Programm in Delphi erstellen, welches auf einem Schachbrett Damen setzt. Diese Damen dürfen nur einmal in horizontaler und einmal in vertikaler Richtung vorkommen (dass Damen auch quer schlagen können, sollen wir zuerst einmal nicht beachten).
Ich sitze jetzt schon etwas an dem Programm komme aber nicht weiter, weil dauernd Fehlermeldungen erscheinen, die ich nicht mehr verstehe.
Kann mal wer über das Programm schauen und mir meine Fehler korrigieren?
Das wäre klasse...
Wenn noch irgendwelche Informationen gebraucht werden, dann lasst es mich schnellstmöglich wissen
Vielen Dank schonmal im Vorraus
Hier der Programmcode:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TBrett = array[1..8,1..8] of boolean; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Label1: TLabel; Edit1: TEdit; procedure SetzeDame; procedure Button1Click(Sender: TObject); function erlaubt(x,y:integer):boolean; private
public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
function erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end;
procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt(x,y,Brett)=true then Brett(x,y):= true; end;
procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Reihe:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Spalte,Reihe]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end;
end. |
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 15.02.10 19:36
Siehe N-Damen-Problem ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 19:42
Danke, aber das bringt mich kein Stückchen weiter, weil dort ja auch keine Lösung genannt wird.
Hast du oder irgendwer andere eine Idee?

|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 15.02.10 19:42
Taddel93 hat folgendes geschrieben : | Wenn noch irgendwelche Informationen gebraucht werden, dann lasst es mich schnellstmöglich wissen |
Wie wärs mit der eigentlichen Fehlermeldung?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 19:46
Ach jaa könnte nicht Schaden
Das sind die Fehlermeldungen, die dort erscheinen:
[Hint] Unit1.pas(38 ): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(39): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(36): Value assigned to 'erlaubt' never used
[Error] Unit1.pas(46): Declaration of 'SetzeDame' differs from previous declaration
[Error] Unit1.pas(51): Undeclared identifier: 'Brett'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18 ): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 15.02.10 19:59
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 20:07
Dann zeigt er mir folgende Fehlermeldungen an:
[Hint] Unit1.pas(38): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(39): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(36): Value assigned to 'erlaubt' never used
[Error] Unit1.pas(52): Missing operator or semicolon
[Error] Unit1.pas(52): Incompatible types: 'TBrett' and 'Boolean'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Mo 15.02.10 20:17
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 20:23
Vielen Dank für eure Hilfen.
Das mit dem TForm1 habe ich gerade gelöscht. Ist ja auch eigentlich klar.
Und die eckigen Klammern habe ich auch abgeändert.
Nun sagt Delphi mir aber, dass in Zeile 51 nicht genügend Parameter sind.
Hier die weiteren Fehlermeldungen:
[Error] Unit1.pas(51): Not enough actual parameters
[Error] Unit1.pas(60): Undeclared identifier: 'Zeile'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Danke für eure Mühe und Geduld
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Mo 15.02.10 20:39
Du hast hier noch einen Unterschied:
Delphi-Quelltext 1: 2: 3: 4: 5:
| TForm1 = class(TForm) function erlaubt(x,y:integer):boolean;
[...] function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean; |
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 20:48
Okay danke..
Hab ich oben im Kopf noch ergänzt.
Aber trotzdem fehlen ihm gewisse Parameter..
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Mo 15.02.10 20:54
Könntest du noch mal den aktuellen kompletten Code schicken, hab irgendwie den Überblick verloren, was jetzt noch fehlerhaft sein könnte.
Ich hab das mal mit Brett als private-Feld von Form1 probiert, da funktioniert alles. Weiß aber nicht genau, ob ich was geändert habe, was hier noch nicht angesprochen wurde.
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 20:59
Ja klar kein Problem.
Das ist jetzt der Code, den ich jetzt in meinem Delphi-Programm habe:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TBrett = array[1..8,1..8] of boolean; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Label1: TLabel; Edit1: TEdit; procedure SetzeDame(Brett:TBrett); procedure Button1Click(Sender: TObject); function erlaubt(x,y:integer;Brett:TBrett):boolean; private
public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
function erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end;
procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt[x,y,Brett]=true then Brett[x,y]:= true; end;
procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Zeile:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Zeile,Reihe]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end;
end. |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 15.02.10 21:03
Einen Prozeduraufruf macht man mit runden Klammern.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Mo 15.02.10 21:10
1. Hier muss, soweit ich weiß, TForm1. davor:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end; |
2. Hier greifst du nicht auf ein Array sondern auf eine Funktion zu -> Klammern
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt(x,y,Brett)=true then Brett[x,y]:= true; end; |
3. Deine Variable heißt Spalte und nicht Zeile
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Reihe:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Reihe,Spalte]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end; |
4. In Button1Click gibt es keine Variable Brett.
Ich würde Brett als Private-Feld von Form1 benutzen und dafür die Übergabe der Variable in deinen Funktionen/Prozeduren weglassen.
Delphi-Quelltext 1: 2:
| private Brett: TBrett; |
So sollte es klappen.
Übrigens solltest du SetzeDame; auch irgendwo aufrufen, oder?
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 21:28
@Mapstar: Erstmal vielen Dank für die Fehlersuche.
Ich habe die Fehler korrigiert und jetzt meckert der Compiler zumindestens nicht.
Das Programm funktioniert soweit, nur dass jetzt im dem Edit-Feld nur - gesetzt werden, obwohl, wenn das Feld nicht belegt ist ein + dahinkommen müsste. Kannst du mir dabei auch noch weiterhelfen?
//Das hängt wahrscheinlich mit dem Setzte Dame zusammen, wo muss ich das einfügen?
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Mo 15.02.10 21:51
Konnte deinen Code in erlaubt() ehrlich gesagt nicht nachvollziehen. Hab ihn mal umgeschrieben.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TForm1.erlaubt(x,y:integer) : boolean; var zeile,spalte:integer; begin result := true; for spalte := 1 to 8 do if Brett[x, Spalte] then begin result := false; break; end; if result then for zeile := 1 to 8 do if Brett[zeile, y] then begin result := false; break; end; end; |
SetzeDame würde ich in Button1Click, vor der Berechnung und Ausgabe aufrufen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin SetzeDame; Anzahl := 0; Memo1.Clear; for Reihe:=1 to 8 do [...] end;
procedure TForm1.SetzeDame; var x,y:integer; begin Reset; for x:=1 to 8 do for y:=1 to 8 do Brett[x,y] := erlaubt(x,y); end; |
Reset habe ich geschrieben, damit das Array wieder komplett auf false gesetzt wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Reset; var x,y: integer; begin for x := 1 to 8 do for y := 1 to 8 do Brett[x,y] := false; end; |
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
Taddel93 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 15.02.10 22:37
Vielen, vielen Dank.. das Programm läuft jetzt einigermaßen.
Noch ein kleiner Fehler tritt auf. Wenn ich die Button1-Procedure aufrufe erscheint im Memo1 folgendes:
+ - - - - - - -
- -
- + - - - - -
- + - - - -
- - -
- - - + - -
- - - - - + -
- - - - - +
Irgendwo muss noch ein Fehler liegen, der das Brett nicht vervollständigt.
Und nochmals vielen, vielen lieben Danke 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 16.02.10 00:07
Der Vergleich mit Booleanwerten (z.B. if shift = true then) ist nicht nur unschön und unlogisch, sondern falsch.
Hier gibt es mal ein kleines Beispiel welches zeigt, wann es schief geht:
www.delphi-forum.de/....php?p=548760#548760
Mehr dazu steht hier:
www.delphi-treff.de/...olean-werten/page/4/
Und warum das auch vollkommen unlogisch ist, wird hier erklärt:
www.delphi-forum.de/....php?p=560637#560637
Nur mal noch so am Rande. Wenn das der Lehrer so erklärt hat, darfst Du ihn von mir aus Steinigen und Vierteilen!. (Pun intendet)
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|