DoomAngel Le 29/11/2004 à 20:36Edité par DoomAngel le 29/11/2004 à 20:53 Voila, j'ai recontré un bug assez important lié notamment aux interruptions.
En fixant des limites à y et x, on se positionne à total=abs(X-x)+abs(Y-y) . disons que la touche LEFT incrémente X et UP incrémente Y.
Après avoir désactivé int1 et int5 :
INT_HANDLER ai1,ai5;
ai1=GetIntVec(AUTO_INT_1);
ai5=GetIntVec(AUTO_INT_5);
SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
SetIntVec(AUTO_INT_5,DUMMY_HANDLER);
On a le prog suivant:
int x=0,y=0,X=9,Y=9,total=3;
do{
if (_keytest(RR_LEFT) && abs(X-x+1)+abs(Y-y)<=totall) X++;
if (_keytest(RR_UP) && abs(X-x)+abs(Y-y+1)<=total) Y++;
}while(1);
Il se trouve que lorsque qu'on appuie simultanément sur UP et LEFT, on obtient à la fin, abs(X-x)+abs(Y-y)=4 !!!
se pourrait -il que la ti ait effectué les 2 opérations parallèlement?
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
euh oui désolé erreur de code j'ai rectifié
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
En fixant des valeurs initiales à y et x, prenant des variables X et Y, et SOMME des distances=abs(X-x)+abs(Y-y) . disons que la touche LEFT incrémente X et UP incrémente Y.
Après avoir désactivé int1 et int5 :
INT_HANDLER ai1,ai5;
ai1=GetIntVec(AUTO_INT_1);
ai5=GetIntVec(AUTO_INT_5);
SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
SetIntVec(AUTO_INT_5,DUMMY_HANDLER);
On a le prog suivant:
int x=0,y=0,X=9,Y=9,total=3;
do{
if (_keytest(RR_LEFT) && abs(X-x+1)+abs(Y-y)<=total) X++;
if (_keytest(RR_UP) && abs(X-x)+abs(Y-y+1)<=total) Y++;
}while(1);
Il se trouve que lorsque qu'on appuie simultanément sur UP et LEFT, on obtient à la fin, abs(X-x)+abs(Y-y)=4 !!!
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
C'est normal, tu incrémentes les 2 en alterné si tu les appuies en même temps. _keytest est un test de touches non-bloquant!
Mais c'est pas le code qu'il a posté qu'il a essayé. 10+9>3, donc "X++" et "Y++" ne sont jamais exécutés.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Ah oui j'ai encore oublié quelque chose, dsl chui crevé
int x=0,y=0,X=2,Y=2,total=3;
comment ca se fait parce qu'après la première incrémentation, Somme est = 3
donc il ne devrai jamais entrer dans la 2ème incrémentation
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
bon dernier essai
int x=0,y=0,X=1,Y=1,total=3;
do{
if (_keytest(RR_LEFT) && abs(X-x+1)+abs(Y-y)<=total) X++;
if (_keytest(RR_UP) && abs(X-x)+abs(Y-y+1)<=total) Y++;
}while(1);
Avant: somme=2
Après: somme=4
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
ok ben jvais te montrer l'original
void move3(void)
{
int tmp,range,x,y,i,j;
range=map[2][mod16(PStat[PStat[1][PTurn]][PposY]+42)][mod16(PStat[PStat[1][PTurn]][PposX]+72)];
range=PUnit[PStat[1][PTurn]][range][PUnitNUM];// get the corresponding number to Udata
range =Udata[range][UnitSpeed];
PStat[PStat[1][PTurn]][PTmp]=PStat[PStat[1][PTurn]][PposX];
PStat[PStat[1][PTurn]][PTmp2]=PStat[PStat[1][PTurn]][PposY];
DRAWMAP(20);
do {
x=mod16(PStat[PStat[1][PTurn]][PposX]+72);
y=mod16(PStat[PStat[1][PTurn]][PposY]+42);
i=mod16(PStat[PStat[1][PTurn]][PTmp]+72);
j=mod16(PStat[PStat[1][PTurn]][PTmp2]+42);
if (_keytest(RR_LEFT) && 71+PStat[PStat[1][PTurn]][PTmp]>=0 && abs(x-(i-1))+abs(y-j)<=range){
for(tmp=0;tmp!=16;tmp++){
mouse2();
ScrollRight160(LIGHT,100);
ScrollRight160(DARK,100);
PStat[PStat[1][PTurn]][PTmp]--;
DRAWMAP(23);
}
}
if (_keytest(RR_RIGHT) && PStat[PStat[1][PTurn]][PTmp]<=XMAX*16-73 && abs(x-(i+1))+abs(y-j)<=range){
for(tmp=0;tmp!=16;tmp++){
mouse2();
ScrollLeft160(LIGHT,100);
ScrollLeft160(DARK,100);
PStat[PStat[1][PTurn]][PTmp]++;
DRAWMAP(24);
}
}
if (_keytest(RR_UP) && 41+PStat[PStat[1][PTurn]][PTmp2]>=0 && abs(x-i)+abs(y-(j-1))<=range){
for(tmp=0;tmp!=16;tmp++){
mouse2();
ScrollDown160(LIGHT,100);
ScrollDown160(DARK,100);
PStat[PStat[1][PTurn]][PTmp2]--;
DRAWMAP(21);
}
}
if (_keytest(RR_DOWN) && PStat[PStat[1][PTurn]][PTmp2]<=YMAX*16-43 && abs(x-i)+abs(y-(j+1))<=range){
for(tmp=0;tmp!=16;tmp++){
mouse2();
ScrollUp160(LIGHT,100);
ScrollUp160(DARK,100);
PStat[PStat[1][PTurn]][PTmp2]++;
DRAWMAP(22);
}
}
if (_keytest(RR_ESC)){
PStat[0][PTmp]=999;
return;
}
} while (!_keytest(RR_ENTER));
}
et donc après la manip, ben on dépasse de 1, range
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
euh et sinon le pb c que tu ne mets à jour i et j qu'au début de la boucle, donc l'incrémentation de PStat[PStat[1][PTurn]][PTmp] n'a aucun effet sur i...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
mais tinkiète, jarrive à me retrouver la dedans lol
(c'est pour ca que je voulais pas copier mon code source au début)
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
boa po drole c'est qu'une erreur de prog. et m***e !!!
bon j'avais po vu cette subtilité.
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
ok jvais regarder si les struct sont plus intéressantes (parce que ya énormément de données numériques)
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)
schblurg??? c quoi ca???
(d'ailleurs c quoi "mon namespace global")
Vive! la Ti-89!
(Mon anneau pylorique est complètement fermé. C'est le résultat de la proximité de cet individu.)