Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi showmessage beeinflusst integer-wert eines arrays? niemals.. (https://www.delphipraxis.net/87876-showmessage-beeinflusst-integer-wert-eines-arrays-niemals.html)

zecke 6. Mär 2007 17:54


showmessage beeinflusst integer-wert eines arrays? niemals..
 
:hi:

Also ich glaube, ich habe noch nie so auf dem Schlauch gestanden, wie jetzt :!:

Ich bastel zur Zeit nebenbei an einem Pokerspielchen herum. Da kommt wieder ein Problem, aber dazu später mehr.

Meine 1. Frage: Delphi (Turbo Delphi) bearbeitet doch Funktion nach Funktion durch oder? Wenn das nicht so ist (Das wäre eine Überraschung für mich), kann das eine Fehlerquelle sein, ansonsten fällt mir Nichts mehr ein...

Ich habe einen Typ TKarte, mit verschiedenen Variablen, in die ich per Zufallsgenerator die Werte hineinlade. Das funktioniert einwandfrei. Nach einem Päärchen und einem Flush zu schauen, funktioniert auch schon zuverlässig. Jetzt bin ich bei der Erkennung eines Drillings.

Ich habe eine Funktion in der ich auf einen Drilling prüfe. Wenn das der Fall ist, wird ein true ausgegeben (bool'sche Funkion). Ansonsten bleibt das Ergebnis false.

Innerhalb der Funktion hatte ich zu Testzwecken ein Showmessage-Befehl, der mir Zwischenwerte anzeigt. Das funktionierte dann einwandfrei, also die Erkennung eines Drillings. Kaum nehme ich lediglich den Showmessage-Befehl heraus, bekomme ich plötzlich bei der Funktion immer ein true zurück...

Das ist komisch, sehr komisch. zum nachvollziehen, die relevanten Stellen des Codes:

Delphi-Quellcode:
type
  TKartenWert = 1..13; // 1 = AS, 11 = Bube, 12 = Dame, 13 = König
  TKartenFarbe = (kfKaro, kfHerz, kfPik, kfKreuz);
  TKartenPosition = 1..5;

  TKarte = class(TObject)
    private
      FWert: TKartenWert;
      FFarbe: TKartenFarbe;
      FPosition: TKartenPosition;
      FUsedCount: Integer;
      FUsedBool: Boolean;
      FUsedPosition: Boolean;
    public
      constructor Create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
      property Wert: TKartenWert read FWert write FWert;
      property Farbe: TKartenFarbe read FFarbe write FFarbe;
      property Position: TKartenPosition read FPosition write FPosition;
      property UsedCount: Integer read FUsedCount write FUsedCount;
      property UsedBool: Boolean read FUsedBool write FUsedBool;
      property UsedPosition: Boolean read FUsedPosition write FUsedPosition;
    end;

var
  Form1: TForm1;
  ABlatt: Array[1..5] of TKarte;
  AsBlatt: Array[1..5] of TKarte;
  PairOneCard,PairTwoCard,UsedCountSumme: Integer;
  PairOneCard2,PairTwoCard2,UsedWertSumme,RFarbe: Integer;
  ThreeCard1,ThreeCard2,ThreeCard3: Integer;
Delphi-Quellcode:
constructor TKarte.create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
begin
  inherited create;
  FWert := Wert;
  FPosition := Position;
  FFarbe := Farbe;
end;

Hier die Funktion zum Testen des Drillings (hier das showmessage auskommentiert):
Delphi-Quellcode:
function isThreeOfAKind():boolean;
var a,b :integer;
begin

ThreeCard1:=0;
ThreeCard2:=0;
ThreeCard3:=0;
UsedCountSumme:=0;

for a:= 1 to 5 do begin
  ABlatt[a].UsedCount:=0;
  ABlatt[a].UsedBool:=false;
  ABlatt[a].UsedPosition:=false;
end;


for a := 1 to 5 do begin
   for b := 1 to 5 do begin
      if ((ABlatt[a].Wert = ABlatt[b].Wert)and(ABlatt[a].Position <> ABlatt[b].Position)) then
       begin
         ABlatt[a].UsedCount:=(ABlatt[a].UsedCount+1);
         ABlatt[b].UsedCount:=(ABlatt[b].UsedCount+1);
       end
   end;
end;

for a:=1 to 5 do begin
  if (ABlatt[a].UsedCount)=4 then
    begin
      ABlatt[a].UsedBool:=true;
    end
end;

for a:=1 to 5 do begin
  if (ABlatt[a].UsedBool=true) then
    begin
      ThreeCard1:=a;
      ABlatt[a].UsedBool:=false;
      break;
    end;
end;

for a:=1 to 5 do begin
  if (ABlatt[a].UsedBool=true) then
    begin
      ThreeCard2:=a;
      ABlatt[a].UsedBool:=false;
      break;
    end;
end;

for a:=1 to 5 do begin
  if (ABlatt[a].UsedBool=true) then
    begin
      ThreeCard3:=a;
      ABlatt[a].UsedBool:=false;
      break;
    end;
end;

{showmessage(inttostr(ABlatt[1].UsedCount)+' '+
            inttostr(ABlatt[2].UsedCount)+' '+
            inttostr(ABlatt[3].UsedCount)+' '+
            inttostr(ABlatt[4].UsedCount)+' '+
            inttostr(ABlatt[5].UsedCount)); }

if ((ThreeCard1>0)and(ThreeCard2>0)and(ThreeCard3>0)) then
begin
      for a:=1 to 5 do
        begin
          UsedCountSumme:=UsedCountSumme+ABlatt[a].UsedCount;
        end;

  if UsedCountSumme=12 then
    begin
      result:=true;
    end else
      begin
        result:=false;
      end;
end;


end;

Die Funktion rufe ich so auf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;

drawKarten(); // die Karten werden per random zugeordnet. Doppelte etc. alles berücksichtigt, hier
              // kann der Fehler nicht sein.

if isOnePair()=true then
  begin
   showmessage('Ein Paar!');
  end;

if isFlush()=true then
  begin
   showmessage('Ein Flush!');
  end;

if isThreeOfAKind()=true then
  begin
   showmessage('Ein Drilling!');
  end;


end;


Nehme ich also das Showmessage in der isThreeOfAKind()-function heraus, bekomme ich die Meldung "Ein Drilling!" immer, egal ob ein Drilling offen liegt oder nicht. Lasse ich das showmessage auskommentiert, bekomme ich nur "Ein Drilling!", wenn wirklich einer da liegt.



So kurios... ich steh' total auf dem Schlauch... bin dankbar für jeden Tipp :gruebel: :?



ps: die Werte werden auch von anderen Funktionen genutzt, aber wie am Anfang der Funktion zu sehen, setze ich alle Werte auf 0 zurück um zu prüfen, was auf dem Tisch liegt.

CK_CK 6. Mär 2007 18:14

Re: showmessage beeinflusst integer-wert eines arrays? niema
 
Bau doch den Code mal ein bisschen um...
Delphi-Quellcode:
if isOnePair then
  showmessage('Ein Paar!')
else if isFlush then
   showmessage('Ein Flush!')
else if isThreeOfAKind then
   showmessage('Ein Drilling!');
Das ist kurz und knackig und müsste funktionieren... ;)

Chris

PS: Das "=true" ist unnötig, da der if-Abfrage schon den True-Wert der Funktionen reicht...

zecke 6. Mär 2007 18:17

Re: showmessage beeinflusst integer-wert eines arrays? niema
 
:hi:

Danke für die Antwort :)

Das könnte ich machen, aber das kann doch nicht das Problem sein oder?
Es wird ja nur eine Meldung ausgegeben, wenn die Funktion true zurückgibt - ansonsten nicht. Von daher doch nur eine kosmetische Sache oder?


zu deinem ps: Ja das werde ich machen. Das ist noch ein Überbleibsel von diversen Tests, das Problem zu beheben ;)

Hawkeye219 6. Mär 2007 18:18

Re: showmessage beeinflusst integer-wert eines arrays? niema
 
Hallo zecke,

das Funktionsergebnis ist nur definiert, wenn alle ThreeCardX-Variablen mit einem Wert größer Null besetzt wurden.

Gruß Hawkeye

zecke 6. Mär 2007 18:25

Re: showmessage beeinflusst integer-wert eines arrays? niema
 
Zitat:

Zitat von Hawkeye219
Hallo zecke,

das Funktionsergebnis ist nur definiert, wenn alle ThreeCardX-Variablen mit einem Wert größer Null besetzt wurden.

Gruß Hawkeye

:thumb: Danke, geändert und es läuft :mrgreen:

Komisch ist nur, dass diese Variante bei einem Paar funktioniert und das selbe Prinzip beim Drilling versagt. Genauso ist mir der Zusammenhang zum Showmessage vollkommen unklar :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz