Autor Beitrag
Taddel93
Hält's aus hier
Beiträge: 10



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


Hier der Programmcode:


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:
unit Unit1;

interface

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

type
    TBrett = array[1..8,1..8of 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 15.02.10 19:42 
user profile iconTaddel93 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 15.02.10 19:46 
Ach jaa könnte nicht Schaden :D

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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mo 15.02.10 19:59 
ausblenden Delphi-Quelltext
1:
[Error] Unit1.pas(46): Declaration of 'SetzeDame' differs from previous declaration					

Schau mal die Deklaration und die Implementierung von SetzeDame an. Einmal mit Parameter und einmal ohne...
ausblenden Delphi-Quelltext
1:
2:
[Error] Unit1.pas(51): Undeclared identifier: 'Brett'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'

Brett hast du in den entsprechenden Prozeduren nicht deklariert...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Taddel93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Mo 15.02.10 20:17 
Zeile 33:
ausblenden Delphi-Quelltext
1:
function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean;					


Zeile 52:
ausblenden Delphi-Quelltext
1:
 Brett[x,y]:= true;					
Taddel93 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Mo 15.02.10 20:39 
Du hast hier noch einen Unterschied:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 15.02.10 20:48 
Okay danke..
Hab ich oben im Kopf noch ergänzt.

Aber trotzdem fehlen ihm gewisse Parameter..
MaPsTaR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 15.02.10 20:59 
Ja klar kein Problem.
Das ist jetzt der Code, den ich jetzt in meinem Delphi-Programm habe:

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:
unit Unit1;

interface

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

type
    TBrett = array[1..8,1..8of 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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 15.02.10 21:03 
Einen Prozeduraufruf macht man mit runden Klammern.

_________________
PROGRAMMER: A device for converting coffee into software.
MaPsTaR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: Mo 15.02.10 21:10 
1. Hier muss, soweit ich weiß, TForm1. davor:
ausblenden 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
ausblenden 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
ausblenden 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



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

Win XP
Delphi 7 Enterprise
BeitragVerfasst: Mo 15.02.10 21:51 
Konnte deinen Code in erlaubt() ehrlich gesagt nicht nachvollziehen. Hab ihn mal umgeschrieben.
ausblenden 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.
ausblenden 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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 :P
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.