EAccessViolation

Résolu
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012 - 30 oct. 2007 à 15:13
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 1 nov. 2007 à 15:11
Salut tout le monde,
Voila j ai un pt problème avec un jeu qui se nomme OXO...
En fait le code ci-dessous est une partie d'un algo de vérification du joueur gagnant la partie. J'utilise un tableau de 8 case de type TColor dans systeme MVC... Ce code est mis dans mon modele :

function SayWin(player:TColor):boolean;
var cpt,ctl,i:integer;
begin
  ctl:=0;
  While(ctl<>8)or(cpt<>3)do begin
    cpt:=0;
    for i:=1 to 3 do begin    //verif verticale
      if (tab[ctl]=player) then
        inc(cpt);
      inc(ctl);
    end;
  end;
  if (cpt=3)then
    result:=true
  else result:=false;
end;

En fait quand j execute et que je clique sur une des cases du DrawGrid un message  EaccesViolation apparait en rapport avec une adresse mémoire.
Le probleme apparemment se situe au nv de cette condition "if (tab[ctl]=player) then"
Pt présision j appelle cette fonction via mon controleur donnant la couleur courante.
Je vs remercie d'avance pour votre aide...

15 réponses

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
31 oct. 2007 à 11:20
Bonjour,
for i:= 1 to 3 do
    begin
      if tab[ctl] = player then
        cpt := cpt + 1;
      ctl := ctl + 1;
    end;
Dans ta boucle for, ctl dépasse 8 .... Avant de passer dans le while ...

Fais un showmessage( inttostr(ctl)) ....

Dom
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 oct. 2007 à 17:09
function SayWin(tab: TypeDeTab; const player: TColor): boolean;
var cpt, ctl, i: integer;
begin
  ctl := 0;
  While (ctl <> 8) or (cpt <> 3) do
  begin
    cpt:=0;
    for i:= 1 to 3 do
    begin
      if tab[ctl] = player then
        cpt := cpt + 1;
      ctl := ctl + 1;
    end;
  end;  result :cpt 3;
end;

<hr size="2" width="100%" />
http://deefaze.gnomz.com
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
30 oct. 2007 à 18:50
heu dites moi si je me trompe :

function SayWin(tab: TypeDeTab; const player: TColor): boolean;
var cpt, ctl, i: integer;
begin  ctl :0; ctl 0
  While (ctl <> 8) or (cpt <> 3) do  equivalent a while not ( (ctl=8) and (cpt=3) ) <--- on s'arrete que si ctl =8 et cpt=3
  begin
    cpt:=0;
    for i:= 1 to 3 do 3 iterations de ....
    begin
      if tab[ctl] = player then
        cpt := cpt + 1;      ctl :ctl + 1; ... ctl ctl+1
    end; donc ici,  ctl = 3, 6, 9, ... donc ctl ne vaudra jamais 8
  end;  result :cpt 3;
end;
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 oct. 2007 à 08:53
Salut foxi,
Merci pour ta réponse mais malheureusement ca ne règle pas mon probleme, ds le sens ou il m'indique un autre probleme(surcharge non indiqué), en fait pour etre plus précis ma variable de type tableau est une variable de classe se trouvant ds mon modele donc je pensais qu'il était possible de l appeler directement ds ma fonction sans devoir le mettre ds les paramètres de la fonction...(ce que j ai fait ds d autre fonction) de plus ca serait étrange de devoir faire ca puisque j appelle alors ds mon controleur cette fonction se trouvant ds le modele donnant comme paramètres "SayWin(Modele.tab,currentplayer)" alors que cette variable s'y trouve
Fin donc je suis tjs aussi perdu
Pour répondre à Guillemouze, While (ctl <> 8) or (cpt <> 3) do  équivaux a while not ( (ctl=8) or (cpt=3) )et ctl := ctl + 1; c'est comme si tu faisais inc(ctl) càd que tu ajoutes un en plus a chaque tour de boucle donc à un moment ca atteindra bien 8 (a part,bien sur, si cpt=3)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 oct. 2007 à 09:57
sorry fOxi,
En fait j'étais mal réveillé , ya pas de probleme de surcharge mais bon en faisant comme tu m as indiqué, j ai tjs le meme probleme de EaccessViolation
En esperant que quelconque personne puisse m aider, merci d'avance
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 oct. 2007 à 12:52
Merci Dom,
Je n avais pas remarqué cette grosse erreur...A force de vouloir tjs tout condenser
Donc si je comprends bien ce EAccessViolation c comme en java IndexOutofBounds? cad qu'il n'acceptait pcq je sortais des limites de mon tableau
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 13:06
merci dom de me soutenir :)

petit rappel pour dvwyns:

A B -A -B AetB AouB -Aet-B -Aou-B-(AetB)-(AouB)
1 1  0  0   1    1     0      0      0       0
1 0  0  1   0    1     0      1      1       0
0 1  1  0   0    1     0      1      1       0
0 0  1  1   0    0     1      1      1       1

si a = (ctl=8)
et b = (cpt=3)

ta condition (ctl<>8) or (cpt<>3) vaut -Aou-B
ta condition not((ctl=8) or (cpt<>3)) vaut -(AouB)
ma condition not((ctl=8) and (cpt=3)) vaut -(AetB)

on remarquera facilement que la verte et la rouge ont les memes valeurs, mais pas la rouge et la bleue !!!

A part ca, merci mais je conais a peu pres les incrementation ;)
par contre je serais toi je reviserai mes boucles / blocs de commandes
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 13:07
EAccessViolation veut dire que tu lis dans un espace memoire que tu ne devrait. ca peut correspondre a un IndexOutOfBounds, mais aussi a plein d'autre choses (acces a une fonction d'un objet non instancié, ...)
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 oct. 2007 à 13:21
Oui donc c était bien ca merci encore Dom...
J ai completement changé mon code, voila le résultat :
function SayWin(player:TColor):boolean;
var i,j,k,cpt:integer;
    findwinner:boolean;
begin
  i:=0;j:=1;k:=2;
  findwinner:=false;
  cpt:=1;
  While not(findwinner)and (cpt<>3) do begin
    inc(cpt);
  if ((tab[i]=player) and (tab[j]=player) and (tab[k]=player)) then begin
    result:=true;
    findwinner:=true;
  end
  else begin i:=i+3;j:=j+3;k:=k+3;
             result:=false;
  end;
  end;
Bon bien sur c est vite fait et juste pour une verif. verticale
++
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
31 oct. 2007 à 13:26
Oui c vrai Guillemouze, j ai tjs eu quelque probleme avec ca(meme avec ton explication j ai encore du mal ) en tout cas merci pour votre aide c etait efficace
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 13:29
je pense que cette fonction a le meme comportement que la tienne (mais est baucoup plus claire!):

function SayWin(player:TColor):boolean;
var
  i: integer;
begin
  i:=0;
  Result := false;
  While not(Result)and (i<2) do
   begin
     Result :=  ((tab[3*i]=player) and (tab[3*i+1]=player) and (tab[3*i+2]=player));
     inc( i);
  end;
end;
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
31 oct. 2007 à 13:32
@dom: bien sur qu'il vaudra 8, vu qu'il incremente de 1 en 1. en plus, j'ai dit : "donc ici,  ctl = 3, 6, 9, ... donc ctl ne vaudra jamais 8" le "ici" est tres important car il se trouve a la fin du for, ce qui signifie qui ne vaudra jamais 8 .... a la fin du for !!!!
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
1 nov. 2007 à 11:00
Oui merci guillemouze,
C est un code comme on les aime , rien d'inutile...
++
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
1 nov. 2007 à 11:13
Au fait juste une pt précision mtn que je l ai testé, c pas While not(Result)and (i<2) do mais While not(Result)and (i<=2) do sinon bien sur le dernier test ne sera pas effectué
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
1 nov. 2007 à 15:11
extrait de ton code :

  i:=0;j:=1;k:=2;
  cpt:=1; 
  While not(findwinner)and (cpt<>3) do begin

devient

  i:=0;j:=1;k:=2;
 cpt:=i+1; 

  While not(findwinner)and (cpt<>3) do begin

devient

  i:=0;j:=1;k:=2;

 cpt:=i+1; 


  While not(findwinner)and ((i+1)<>3) do begin

devient

  i:=0;j:=1;k:=2;


 cpt:=i+1; 



  While not(findwinner)and (i<>2) do begin
0
Rejoignez-nous