Funktion als Boolean ?!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Funktion als Boolean ?!

Beitrag von SIrRonBird »

Hallo Leute,
im Rahmen unseres Unterrichtes sollen wir ein BACKTRACKING Problem lösen !
Nun wollte ich in einer Funktion Prüfen ob etwas funktioniert (mit Boolean)!

Ich habe es wie Folgt gemacht:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    ListBox1: TListBox;
    ListBox2: TListBox;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Feld_frei(a,b:integer;VAR t:Boolean);
  private
 
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var i,a,b:integer;
begin
  For i:=0 to 7 do
  begin
    ListBox1.Items[i]:=inttostr(0);
    ListBox2.Items[i]:=inttostr(0);
  end;
For a:=0 to 7 do
begin
  For b:=0 to 7 do
  begin
    if Feld_frei(1,1)= true then
       Begin
         StringGrid1.Cells[b,a]:='D';
         ListBox1.Items[a]:=InttoStr(a);
         ListBox2.Items[b]:=InttoStr(b);
       end;[code=laz]
else if a=7 then
StringGrid1.Cells[ListBox1.Items,ListBox2.Items[a]]:='';
end;
end;
 
end;
procedure Feld_frei(a,b:integer;VAR t:Boolean);
Var s,z:integer;
Begin
t:= True;
end;
 
end.[/code]

Der Wichtige Teil ist :

Code: Alles auswählen

procedure Feld_frei(a,b:integer;VAR t:Boolean);
Var s,z:integer;
Begin
   t:= True;
end;
Entweder habe ich total gefailt oder ich weiß nicht Wie man es macht !
Bitte helft mir !

MfG SRB

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Funktion als Boolean ?!

Beitrag von theo »

SIrRonBird hat geschrieben: Nun wollte ich in einer Funktion Prüfen ob etwas funktioniert (mit Boolean)!
Eine Funktion wäre hier auch sinnvoll, du verwendest aber eine Prozedur.

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Funktion als Boolean ?!

Beitrag von SIrRonBird »

Was ist der unterschied ?
könntest du die Definition nennen ?!

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Funktion als Boolean ?!

Beitrag von Soner »

Mach es so:

Code: Alles auswählen

 
function Feld_frei(a,b:integer) :Boolean;
Var s,z:integer;
Begin
   Result:= True; //result ist rückgabewert
end;
 
Hier kannst du lesen warum das so ist:
http://www.marcocantu.com/epascal/German/ch06procde.htm

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Funktion als Boolean ?!

Beitrag von SIrRonBird »

Hallo,

nun habe ich ein anderes Problem wobei mir mein Lehrer auch nicht helfen kann !

Ich bin so weit :

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    ListBox1: TListBox;
    ListBox2: TListBox;
    StringGrid1: TStringGrid;
    function Feld_frei(a,b:integer):Boolean;
    procedure Button1Click(Sender: TObject);
 
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var i,a,b,x,y:integer;
begin
  For i:=0 to 7 do
  begin
    ListBox1.Items[i]:=inttostr(0);
    ListBox2.Items[i]:=inttostr(0);
  end;
For a:=0 to 7 do
begin
  For b:=0 to 7 do
  begin
    if Feld_frei(a,b)= true then
       Begin
         StringGrid1.Cells[b,a]:='D';
         ListBox2.Items[a]:=InttoStr(a);
         ListBox1.Items[b]:=InttoStr(b);
       end
    else if a=7 then
         x:=strtoint(ListBox1.Items[b]);
         y:=strtoint(ListBox2.Items[a]);
         StringGrid1.Cells[x,y]:='';
  end;
end;
 
end;
function TForm1.Feld_frei(a,b:integer) :Boolean;
Var temp,y,x:integer;
Begin
for temp := 0 to 7 do
  begin
    x := temp + b;
    y := temp + a;
    if (y > -1) and (y < 8) and (x > -1) and (x < 8) then
    begin
      if Stringgrid1.Cells[x,y] = 'X' then
      begin
        result := True;
      end;
    end;
    x := b - temp;
    y := a - temp;
    if (y > -1) and (y < 8) and (x > -1) and (x < 8) then
    begin
      if Stringgrid1.Cells[x,y] = 'X' then
      begin
        result := True;
      end;
    end;
    x := b - temp;
    y := a + temp;
    if (y > -1) and (y < 8) and (x > -1) and (x < 8) then
    begin
      if Stringgrid1.Cells[x,y] = 'X' then
      begin
        result := True;
      end;
    end;
    x := b + temp;
    y := a - temp;
    if (y > -1) and (y < 8) and (x > -1) and (x < 8) then
    begin
      if Stringgrid1.Cells[x,y] = 'X' then
      begin
        result := True;
      end;
    end;
 
end;
end;
 
 
end. 
Er gibt beim kompilieren keinen Fehler aber wenn ich den Button1 Drücke kommt :
Unbenannt.png
Ich Weiß nicht was Falsch ist !?

Wäre cool wenn ihr mit helfen könntet !

MfG SRB

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Funktion als Boolean ?!

Beitrag von Soner »

Was falsch ist steht doch im Screenshot. Einer bei deinen Stringgrid1.Cells[x,y] Zugriffs X ist größer als dein Spaltenanzahl.

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Funktion als Boolean ?!

Beitrag von SIrRonBird »

Ja das Weiß ich aber ich habe nichts gefunden !?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Funktion als Boolean ?!

Beitrag von Socke »

Da stelle ich ganz kühn die Vermutung in den Raum, dass dein Lehrer dir durchaus helfen könnte, wenn er denn wollte. Es gibt schließlich noch weitere Schüler in deinem Kurs/deiner Klasse, die grundlegendere Fragen haben.

Was dein Problem angeht: offensichtlich zählt da was falsch.
Wie geht man da vor? -- Ganz einfach!
  • Drucke dir den Quelltext aus.
  • Schalte den Computer aus! -- Das hilft wirklich.
  • Nimm dir ein Blatt Papier (evtl. auch zwei) und einen Stift
  • Schreibe dir die einzelnen Schritte, die deine Funktion durchläuft auf. Welchen Inhalt hat welche Variable am Anfang der Funktion. Was passiert dann mit den Variablen in jedem einzelnen Schritt.
  • Irgendwo wirst du wohl einen Zahlendreher, einen falschen Vergleichsoperator (beispielsweise größer gleich anstatt gleich), oder etwas ganz anderes finden, das nicht das tut, was du willst.
  • Korrigiere den Fehler auf dem Blatt Papier beziehungsweise auf dem Quelltextausdruck.
  • Lasse dich von deinem Lehrer für dein sorgfältiges und strukturiertes Vorgehen loben.
  • Schalte den Computer wieder ein.
  • Ändere deinen Quelltext.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Funktion als Boolean ?!

Beitrag von Soner »

Er kann ja auch den Debugger benutzen dafür ist der Debugger da.
Ich habe mal den Debugger gespielt und tippe hier ist dein Fehler:

Code: Alles auswählen

x:=strtoint(ListBox1.Items[b]);
Vorausgesetzt dein Grid hat 8 Spalten, kontrollierst du in der Funktion Feld_frei die Bereiche. Aber in der Funktion Button1Click greifst du in die Spalte nach

Code: Alles auswählen

x:=strtoint(ListBox1.Items[b]);
ohne Bereichskontrolle. Also

Code: Alles auswählen

ListBox1.Items[b]
muss eine Zahl<0 oder >7 zurückliefern.

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Funktion als Boolean ?!

Beitrag von Antrepolit »

Die Spalten und Zeilen eines Grid fangen - entgegen allen Arrays, Listen etc. - bei 1 und nicht bei 0 an. Wenn du auf Grid.Cells[0,0] zugreift, erhälst du diese Index-Out-Of-Bounds-Exception.
Als Anfänger kannst du das natürlich nicht wissen.

Deshalb hätte ihm das ja mal eher jemand sagen können, statt ihn nur auf Irrfahrten durch die IDE zu schicken. Er will doch bloß den Programmierkram für die Schule machen... was braucht er da den Debugger?!
Grüße, Antrepolit

care only if your os is really burning

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Funktion als Boolean ?!

Beitrag von Socke »

Antrepolit hat geschrieben:Die Spalten und Zeilen eines Grid fangen - entgegen allen Arrays, Listen etc. - bei 1 und nicht bei 0 an. Wenn du auf Grid.Cells[0,0] zugreift, erhälst du diese Index-Out-Of-Bounds-Exception.
Wenn du seinen Screenshot betrachtet hättest, siehst du dort den Spaltenindex 1975633296 und den Zeilenindex 0.

Übrigens ist der Index 0 für Spalten und Zeilen ein durchaus gültiger Index (sofern diese vorhanden sind). Es gilt die Regel (für Zeilen und Spalten): größter Index = Anzahl - 1. Daher hat das wohl auch keiner erwähnt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Funktion als Boolean ?!

Beitrag von Antrepolit »

Wo soll denn eine so große Zahl herkommen, wenn er von 0 bis 7 iteriert? Das kommt daher, dass einer Cardinal-Variable (oder einem anderen nicht-negativem Typ) der Wert -X zugewiesen wird oder weil mit einem negativen Index auf das Stringgrid zugegriffen wird. Und das passiert genau dann, wenn etwas bei 0 anfängt zu iterieren, und bspw. das Count-Property den Index-1 (also 0-1) zurückliefert. Genau danach sieht diese Exception für mich aus, die ich mir sehr wohl angeschaut habe.
Grüße, Antrepolit

care only if your os is really burning

Antworten