Tjeri - Mo 28.09.09 20:52
Titel: Acces Violation
Ich hab keine Ahnung wo der Fehler liegt, ich geb am besten das ganze Projekt rein, den Code wo der den Fehler anzeigt stell ich hier einzeln rein:
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: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312:
| function Kartenhoehe(ID:integer):TAusgabe; var x,y,z:integer; var Hoehe:integer; var Paar:Array[1..13]of integer; var Paar1,Paar2,Drilling,Vierling:integer; var Fullhouse:Array[1..2] of integer; var Strasse:Array[1..5] of integer; var Flush:Array[1..5] of integer; var Straightflush:boolean; var Straightflushdraw:boolean; var abgebrochen:boolean; var HoechsteKarten:Array[1..7] of integer; var hilfe:integer; begin Paar1:=0; Paar2:=0; Drilling:=0; Vierling:=0; Fullhouse[1]:=0; Fullhouse[2]:=0; Strasse[4]:=0; Strasse[5]:=0; Flush[4]:=0; Flush[5]:=0; Straightflush:=false; Straightflushdraw:=false;
begin for x:=1 to 7 do HoechsteKarten[x]:=HoeheBerechnen(SpielerKarten[ID,x]); HIER IST DER FEHLER begin for x:=1 to 7 do for y:=1 to 7 do if y<7 then if (HoechsteKarten[y]>HoechsteKarten[y+1]) OR (HoechsteKarten[y]=0) then begin hilfe:=HoechsteKarten[y]; HoechsteKarten[y]:=HoechsteKarten[y+1]; HoechsteKarten[y+1]:=hilfe; end; end; end; for x:=1 to 13 do Paar[x]:=0;
begin for x:=1 to 6 do begin abgebrochen:=false; if SpielerKarten[ID,x]=0 then break; for y:=x+1 to 7 do begin if (SpielerKarten[ID,y]=0) then break; if abgebrochen=false then begin if HoeheBerechnen(SpielerKarten[ID,x])=HoeheBerechnen(SpielerKarten[ID,y]) then begin Hoehe:=HoeheBerechnen(SpielerKarten[ID,x]); Paar[Hoehe]:=Paar[Hoehe]+1; abgebrochen:=true; end; end; end; end; end; begin for x:=1 to 13 do begin if Paar[x]=1 then begin if Paar1=0 then Paar1:=x else if Paar2=0 then Paar2:=x else if (x<Paar1) OR (x<Paar2) then if Paar1<Paar2 then Paar2:=x else Paar1:=x; end; if Paar[x]=2 then Drilling:=x; if Paar[x]=3 then begin Vierling:=x; break; end; end; if (Drilling<>0) AND (Paar1<>0) then begin Fullhouse[1]:=Drilling; Fullhouse[2]:=Paar1; if (Paar2<>0) AND (Paar2<Paar1) then Fullhouse[2]:=Paar2; end; end; if Vierling=0 then begin for x:=1 to 7 do begin if Strasse[4]<>0 then break; Strasse[1]:=SpielerKarten[ID,x]; abgebrochen:=true; for y:=1 to 4 do begin if abgebrochen then begin abgebrochen:=false; for z:=1 to 7 do begin if (abgebrochen=false) AND (HoeheBerechnen(SpielerKarten[ID,z])=Strasse[y]+1) then begin Strasse[y+1]:=SpielerKarten[ID,z]; abgebrochen:=true; end; end; end; end; end; if (HoeheBerechnen(Strasse[1])=10) AND (HoeheBerechnen(Strasse[4])=13) then if HoechsteKarten[1]=1 then for x:=1 to 7 do if HoeheBerechnen(SpielerKarten[ID,x])=1 then Strasse[5]:=SpielerKarten[ID,x]; end; if Vierling=0 then begin for x:=1 to 4 do begin if Flush[4]<>0 then break; Flush[1]:=SpielerKarten[ID,x]; hilfe:=x+1; for y:=2 to 5 do begin abgebrochen:=false; for z:=hilfe to 7 do begin if (abgebrochen=false) then begin if (FarbeBerechnen(Flush[1])=FarbeBerechnen(SpielerKarten[ID,z])) then begin Flush[y]:=SpielerKarten[ID,z]; abgebrochen:=true; end; hilfe:=hilfe+1; end; end; end; end; end; begin if Flush[5]<>0 then begin begin for x:=1 to 5 do for y:=1 to 5 do if y<5 then if Flush[y]>Flush[y+1] then begin hilfe:=Flush[y]; Flush[y]:=Flush[y+1]; Flush[y+1]:=hilfe; end; end; end; end;
if (Strasse[4]<>0) AND (Flush[4]<>0) then begin hilfe:=0; for x:=1 to 5 do if Strasse[1]=HoeheBerechnen(Flush[1]) then hilfe:=hilfe+1 else break; if hilfe=4 then Straightflushdraw:=true; if hilfe=5 then Straightflush:=true; end; begin result[1]:=0; result[2]:=HoechsteKarten[1]; result[3]:=HoechsteKarten[2]; result[4]:=HoechsteKarten[3]; result[5]:=HoechsteKarten[4]; result[6]:=HoechsteKarten[5];
if (Strasse[4]<>0) AND (Strasse[5]=0) then result[1]:=1;
if (Flush[4]<>0) AND (Flush[5]=0) then result[1]:=2;
if (Straightflushdraw) then result[1]:=3;
if (Paar1<>0) AND (Paar2=0) then begin result[1]:=4; result[2]:=Paar1; result[3]:=Paar1; if (Paar1<>HoechsteKarten[1]) AND (Paar1=HoechsteKarten[2]) then result[4]:=HoechsteKarten[1] else if Paar1=HoechsteKarten[3] then begin result[4]:=HoechsteKarten[1]; result[5]:=HoechsteKarten[2]; end else if Paar1=HoechsteKarten[4] then begin result[4]:=HoechsteKarten[1]; result[5]:=HoechsteKarten[2]; result[6]:=HoechsteKarten[3]; end; end;
if (Paar1<>0) AND (Paar2<>0) then begin result[1]:=5; result[2]:=Paar1; result[3]:=Paar1; result[4]:=Paar2; result[5]:=Paar2; result[6]:=HoechsteKarten[1]; if Paar1>Paar2 then begin result[2]:=Paar2; result[3]:=Paar2; result[4]:=Paar1; result[5]:=Paar1; end; if (result[2]=HoechsteKarten[1]) then if result[4]=HoechsteKarten[3] then result[6]:=HoechsteKarten[5] else result[6]:=HoechsteKarten[3]; end;
if (Drilling <>0) AND (Paar1=0) then begin result[1]:=6; result[2]:=Drilling; result[3]:=Drilling; result[4]:=Drilling; result[5]:=HoechsteKarten[1]; result[6]:=HoechsteKarten[2]; if Drilling=HoechsteKarten[1] then begin result[5]:=HoechsteKarten[4]; result[6]:=HoechsteKarten[5]; end; if Drilling=HoechsteKarten[2] then result[6]:=HoechsteKarten[5]; end;
if Strasse[5]<>0 then begin result[1]:=7; for x:=1 to 5 do result[x+1]:=Strasse[x]; end;
if Flush[5]<>0 then begin result[1]:=8; for x:=1 to 5 do result[x+1]:=HoeheBerechnen(Flush[x]); end;
if FullHouse[1]<>0 then begin result[1]:=9; result[2]:=FullHouse[1]; result[3]:=FullHouse[1]; result[4]:=FullHouse[1]; result[5]:=FullHouse[2]; result[6]:=FullHouse[2]; end;
if Vierling<>0 then begin result[1]:=10; result[2]:=Vierling; result[3]:=Vierling; result[4]:=Vierling; result[5]:=Vierling; if HoechsteKarten[1]=Vierling then result[6]:=HoechsteKarten[5] else result[6]:=HoechsteKarten[1]; end;
if Straightflush then begin if Strasse[1]=1 then result[1]:=12 else result[1]:=11; for x:=1 to 5 do result[x+1]:=Strasse[x]; end; end; end; |
Fehler: Project Poker.exe raised exception class EAccessViolation with message 'Access violation at address 0047B687 in module 'Poker.exe'. Read of address 074C0F20'. Process stopped. Use Step or Run to continue.
Fehler bei Spiel starten und dann setzen.
Xentar - Mo 28.09.09 20:56
Bitte nur den Code (+ umliegenden), wo der Fehler auch wirklich angezeigt wird..
Außerdem:
- Wenn der Fehler auftritt, zeigt dir Delphi doch an, WO dies geschieht. <-- Edit: OK, hatte es überlesen - du hast die Stelle markiert.
- Access Violations kommen daher, dass du auf ungültigen Speicher zugreifst. Also entweder, du läufst z.B. über dein Array hinaus, oder du greifst auf ein Objekt zu, ohne es vorher zu erzeugen.
Schalt mal in den Projektoptionen -> Compileroptionen -> Bereichsprüfung ein, erzeuge das Projekt neu, und lass es dann nochmal laufen. Vielleicht zeigt dir Delphi schon an, wo das Problem ist.
Edit:
So, habs mir nun doch mal angetan.
Eins vorweg: Gewöhn dir mal an, deinen Quellcode "richtig" zu formatieren.
http://www.delphi-treff.de/delphi-styleguide/
Dann:
Mit einem Haltepunkt + fünfmal F9 drücken (Notiz an dich: Tutorial zum Thema "Debuggen" lesen), kommt folgendes ans Licht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function Kartenhoehe(ID:integer):TAusgabe; ...... begin ...... for x:=1 to 7 do HoechsteKarten[x]:=HoeheBerechnen(SpielerKarten[ID,x]); |
unter Umständen kann es sein, dass ID nicht initialisiert ist.. hat dann also mal den Wert 4408892 oder so ähnlich -> Du greifst auf ein ungültiges Array Element zu.
Der Aufruf Stack sagt mir, dass die Prozedur in diesem Fall von "PotAufteilen" aufgerufen wird, Zeile 351.
Warum dem so ist kann ich dir nicht sagen - könnte mir aber vorstellen, dass es an dieser Stelle noch keinen "Sieger" gibt, somit das entsprechende Array ungültige Werte enthält.
Dann noch was allgemeines:
Ich weiß ja, dass man als Anfänger gerne möglichst "kreativ" wirken möchte (ja, ich war auch mal so ;) ), aber diese wechseönden Hintergrundfarben (mal rot, dann grün, oder schwarz), tun etwas in den Augen weh :D Genau wie diese Micky Mouse Schrift. Aber denk mal,das wirst du selber noch merken :D
Und zum Schluss:
Schau dir bei den Formularen bitte die eigenschaft "Position" an. Damit bekomsmt du es sehr leicht hin, dass alle Formulare z.B. mittig geöffnet werden, und nicht "irgendwo in der Ecke".