begin process at 2010 02 10 05:46:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Algorithme

 > 

Autre

 > 

EAccessViolation


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

EAccessViolation

mardi 30 octobre 2007 à 15:13:09 | EAccessViolation

dvwyns

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...
mardi 30 octobre 2007 à 17:09:10 | Re : EAccessViolation

f0xi

Membre Club Administrateur CodeS-SourceS



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;



deefsign.gif
mardi 30 octobre 2007 à 18:50:13 | Re : EAccessViolation

Guillemouze

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;
mercredi 31 octobre 2007 à 08:53:35 | Re : EAccessViolation

dvwyns

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)

mercredi 31 octobre 2007 à 09:57:59 | Re : EAccessViolation

dvwyns

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
mercredi 31 octobre 2007 à 11:20:04 | Re : EAccessViolation

dominique.stock

Réponse acceptée !

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

mercredi 31 octobre 2007 à 12:52:51 | Re : EAccessViolation

dvwyns

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


mercredi 31 octobre 2007 à 13:06:10 | Re : EAccessViolation

Guillemouze

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
mercredi 31 octobre 2007 à 13:07:40 | Re : EAccessViolation

Guillemouze

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é, ...)
mercredi 31 octobre 2007 à 13:21:01 | Re : EAccessViolation

dvwyns

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
++

1 2

Cette discussion est classée dans : player, begin, cpt, ctl, if


Répondre à ce message

Sujets en rapport avec ce message

SetFocus sur Controls[i] impossible ! [ par NESTORORG ] J'ai une Form1 contenant : x controls "TEdit"et y controls "Button"je voudrais que le focus passe sur le control[x+1] à chaque pression de la touche " Valeur in TList ? prob pointeur [ par Bruto ] Je voudrais déterminer si une string est contenue dans un obje TList mais le problème des pointeurs se posent. Voici mon code.Les objets TList ne me p Question aux internautes [ par Bacterius ] Bonjour, je voudrais juste savoir s'il est possible d'exprimer deux résultats d'une opération sans passer par "begin" "end" .Exemple :begin         if Spin edit [ par watrem ] bonjour , certainement suite a une mauvaise manip j'ai une erreur dans le "source" du spin edit , j'ai reinstaller delphi et l'erreur est toujours pre Error E/S 32 sur ecriture et suppresion [ par te56350 ] slt tt le mondej'Ai besoin d'une solution pour mon projet en cour SVPMon projet gère des comptes utilisAteurs Et qu'An j'enregistre des comptes çA fon Creation de processus [ par User8 ] Bonjour, j'ai créé un objet permettant de lancer une application. Celui ci créé le process puis va lire son état à chaque top d'un timer. Des événeme image [ par smail002 ] salut tous ya til un petie code source pour se proget j ai trau d image dan mon proget il ya tout model mobile nokia stp donne moi tou simple c supprimer une ligne dans un fichier texte [ par grod0026 ] bonsoir voila j essaye de supprimer une ligne dans un fichier texte, Donc j'ouvre mon fichier original et le temporaire. si l'enregistrement est égal ADOQuery.lookup et résultat null [ par othland ] Bonjour à tous, pouvez vous m'aider sur un problème relatif au résultat null envoyé par un ADOQuery.lookup?????[^^confus5] j'ai essayé : if (ADOQuery1 Tri d'une wwDBGrid [ par vincedelphi ] bonjour, voila j'utilise une procédure me permettant faire un tri croissant/décroissant dans un wwDBGrid (rattachée à une ibTable): procedure DoSort


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,250 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales