EAccessViolation [Résolu]

dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 30 oct. 2007 à 15:13 - Dernière réponse : Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

16 réponses

dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 31 oct. 2007 à 11:20
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dominique.stock
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 30 oct. 2007 à 17:09
0
Utile
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
Commenter la réponse de f0xi
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 30 oct. 2007 à 18:50
0
Utile
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;
Commenter la réponse de Guillemouze
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 31 oct. 2007 à 08:53
0
Utile
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)
Commenter la réponse de dvwyns
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 31 oct. 2007 à 09:57
0
Utile
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
Commenter la réponse de dvwyns
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 31 oct. 2007 à 12:52
0
Utile
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
Commenter la réponse de dvwyns
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 31 oct. 2007 à 13:06
0
Utile
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
Commenter la réponse de Guillemouze
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 31 oct. 2007 à 13:07
0
Utile
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é, ...)
Commenter la réponse de Guillemouze
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 31 oct. 2007 à 13:21
0
Utile
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
++
Commenter la réponse de dvwyns
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 31 oct. 2007 à 13:23
0
Utile
Guillemouze j'aurais tendance à dire que ctl a bien la valeur 8 à un moment mais à ce moment n'est pas testé par la condition while car dans la boucle du for , il sort du for avec la valeur 9 ....

Dom
Commenter la réponse de dominique.stock
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 31 oct. 2007 à 13:26
0
Utile
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
Commenter la réponse de dvwyns
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 31 oct. 2007 à 13:29
0
Utile
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;
Commenter la réponse de Guillemouze
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 31 oct. 2007 à 13:32
0
Utile
@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 !!!!
Commenter la réponse de Guillemouze
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 1 nov. 2007 à 11:00
0
Utile
Oui merci guillemouze,
C est un code comme on les aime , rien d'inutile...
++
Commenter la réponse de dvwyns
dvwyns 160 Messages postés mardi 2 janvier 2007Date d'inscription 7 mai 2012 Dernière intervention - 1 nov. 2007 à 11:13
0
Utile
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é
Commenter la réponse de dvwyns
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 1 nov. 2007 à 15:11
0
Utile
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
Commenter la réponse de Guillemouze

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.