AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi showmessage beeinflusst integer-wert eines arrays? niemals..
Thema durchsuchen
Ansicht
Themen-Optionen

showmessage beeinflusst integer-wert eines arrays? niemals..

Ein Thema von zecke · begonnen am 6. Mär 2007 · letzter Beitrag vom 6. Mär 2007
Antwort Antwort
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#1

showmessage beeinflusst integer-wert eines arrays? niemals..

  Alt 6. Mär 2007, 18:54


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



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.
mfg zecke
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: showmessage beeinflusst integer-wert eines arrays? niema

  Alt 6. Mär 2007, 19:14
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...
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: showmessage beeinflusst integer-wert eines arrays? niema

  Alt 6. Mär 2007, 19:17


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
mfg zecke
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: showmessage beeinflusst integer-wert eines arrays? niema

  Alt 6. Mär 2007, 19:18
Hallo zecke,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: showmessage beeinflusst integer-wert eines arrays? niema

  Alt 6. Mär 2007, 19:25
Zitat von Hawkeye219:
Hallo zecke,

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

Gruß Hawkeye
Danke, geändert und es läuft

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
mfg zecke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 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