
mais bon en jonglant avec l'editeur de la ti ca va
'fin c un bon prg quand mm et c le pied de pouvoir faire du C directement sur une calculatrice
je crois que la ti est la seule a permettre cela donc longue vie a gtc ...
samy (./33) :
euhhhh j'ai honte de poser une telle question mais je n'y arrive vraiment pas:
ça concerne la lecture bas niveau du clavier avec la fonction _rowread (ou _keytest), j'utilise la syntaxe proposée dans la doc de tigcc:
if (_rowread(~0x4) & 0x8) //censer lire la touche 9
{ //mon code
}
et là quand je test le programme le code foncitonne bien pour la touche 9, mais également pour toute les touches de la même ligne
if(_keytest(RR_9)) { // etc }
samy (./37) :C'est peut-être l'historique ?
ok merci pour l'astuce ça fonctionne bien maintenant...
et j'ai encore des nouvelles questions:-quand je GTC compile le programme après il y a un peu moins de mémoire, et si je recompile exactement le même programme il y a encore de la perte de mémoire.... est ce normal?
-sinon autre question plus relative à la prog: quand je fait une boucle dans la fonction ans et que j'appel la fonction return ou exit , il faut la rappeler plusieurs fois pour quitter réelllement le programme, or avec le même code sous tigcc, un seul appel à cette fonction permet de quitter le prog... comment faire pour quitter directement un programme
(je reprécise que exit est compris dans une boucle
, et que le code fonctionne parfaitement sur tigcc)
void _main(void) { unsigned char mode; INT_HANDLER save_int_1 = GetIntVec(AUTO_INT_1); //remove interuptions 1 and 5 INT_HANDLER save_int_5 = GetIntVec(AUTO_INT_5); SetIntVec(AUTO_INT_1,DUMMY_HANDLER); SetIntVec(AUTO_INT_5,DUMMY_HANDLER); if (!GrayOn()) { SetIntVec(AUTO_INT_1,save_int_1); SetIntVec(AUTO_INT_5,save_int_5); return; } FontSetSys(F_4x6); for (;; ) { clearscreen(); GraySetAMSPlane(DARK_PLANE); DrawStr(1, 1, "Sprite Editor v 0.1", A_NORMAL); DrawStr(1, 11, "F1- Sprite 8x8", A_NORMAL); DrawStr(1, 21, "F2- Sprite 16x16", A_NORMAL); DrawStr(1, 31, "F3- Exit", A_NORMAL); GraySetAMSPlane(LIGHT_PLANE); DrawStr(1, 1, "Sprite Editor v 0.1", A_NORMAL); DrawStr(1, 11, "F1- Sprite 8x8", A_NORMAL); DrawStr(1, 21, "F2- Sprite 16x16", A_NORMAL); DrawStr(1, 31, "F3- Exit", A_NORMAL); for (;; ) { if (_keytest(RR_F1)) //read F1 for 8*8 sprites { mode = 8; GRID_SIZE = 4; break; } if (_keytest(RR_F2)) //read F2 for 16*16 sprites { mode = 16; GRID_SIZE = 3; break; } if (_keytest(RR_F3)) { GrayOff(); //restore interuption 1and 5 after quitting grayscale SetIntVec(AUTO_INT_1,save_int_1); SetIntVec(AUTO_INT_5,save_int_5); pause(50); //a little pause in order to GKeyFlush(); //empty the key buffer exit(0); } } clear_bmp_tab(mode,C_MASK); gui(mode); update(mode); info(); edit(mode); } }
DoomAngel (./48) :
Je termine par un ngetchx() avec pas mal de printf dans le prog.
Je travaille sur des tableaux (non dynamiques)
Ca pourrait etre du à quoi?
DoomAngel (./48) :
AJOUT: si je supprime outbin(), gtc_ide() ne plante plus...
Quand je quitte le programme et que je relance, current conserve sa valeur de la précédente exécution lol.
Je suis obligé de réinitialiser ces 2 variables soit dans le __main soit dans une fonction d'init. A croire que les affectations n'ont servi qu'à la toute première exécution...
TailsMilesPower (./51) :
Salut,
tout d'abord merci Pollux et un grand bravo pour ton compilateur.![]()
![]()
Par contre y' a-t-il moyen de consulter le fichier assembleur produit ? En effet, GTC me retourne une erreur du genre : "error in file ' ', in function __main : ] expected".
==>Ca n'a pas l'air de provenir de ma source codee en C.
En tête : déclaration des variables globales : #include <tigcclib>
#define MAXX 10
#define MAXY 10
#define CHOIX 6
int current,done;
int zone[MAXY][MAXX];
int tab[MAXY][MAXX];
const int tabl[CHOIX][MAXY][MAXX]=
{
{
{0,0,1,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,1,0,0,1,0,0,0,0,0},
{0,1,1,0,1,0,0,0,0,1},
{0,0,1,0,1,0,0,0,0,1},
{0,1,1,0,1,0,0,0,0,1},
{0,1,0,0,1,0,0,0,0,1},
{0,1,1,0,1,1,1,0,1,1},
{0,0,1,0,0,0,1,1,1,0},
{0,1,1,0,0,0,0,0,0,0}
},
{
{0,1,1,1,0,1,1,1,0,0},
{1,1,0,1,1,1,0,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,1,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,0,1,1,1,1,0,0,0,0}
},
{
{0,0,1,1,1,0,1,1,1,0},
{0,1,1,0,1,1,1,0,1,1},
{1,1,1,0,0,0,0,0,0,0},
{0,0,1,0,1,1,0,0,0,0},
{0,1,1,1,1,1,0,0,0,0},
{0,1,0,0,0,0,0,0,0,1},
{0,1,1,0,0,0,0,0,0,1},
{0,0,1,0,0,1,1,1,0,1},
{0,1,1,0,1,1,0,1,1,1},
{0,1,0,0,0,0,0,0,0,0}
},
{
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,0,1,1,0},
{0,1,1,1,0,0,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,1,1,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,1,1,1,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
},
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0},
{1,0,1,1,1,1,1,1,1,1},
{1,0,1,0,0,0,0,0,0,1},
{1,0,1,0,1,1,1,1,0,1},
{1,0,1,0,1,0,0,1,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
},
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,0,1,0,1,0,0,1,0,1},
{1,0,1,0,1,1,1,1,0,1},
{1,0,1,0,0,0,0,0,0,1},
{1,0,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0
Fonctions utilitaires : void loadTab(int i)
{
int x,y;
for(y=0;y<MAXY;y++)
for(x=0;x<MAXX;x++)
{
zone[y][x]=0;
tab[y][x]=tabl[i][y][x];
}
}
void showTab()
{
int x,y;
clrscr();
for(y=0;y<MAXY;y++)
{
for(x=0;x<MAXX;x++)
if(tab[y][x])
printf("#");
else
printf(" ");
printf("\n");
}
}
void showZone()
{
int x,y;
clrscr();
for(y=0;y<MAXY;y++)
{
for(x=0;x<MAXX;x++)
printf("%d",zone[y][x]);
printf("\n");
}
}
void show(int val)
{
int current=1;
int key=0;
int choix=0,pre=-1;
while(key!=KEY_ESC)
{
if(key==KEY_DOWN || key==KEY_UP)
current=1-current;
if(val && key==KEY_LEFT)choix--;
if(val && key==KEY_RIGHT)choix++;
if(choix<0)choix=0;
if(choix>=CHOIX)choix=CHOIX-1;
if(val && choix!=pre)
{
loadTab(choix);
pre=choix;
}
if(current) showTab();
else showZone();
if(val)
printf("Choix:%d/%d",choix+1,CHOIX);
key=ngetchx();
}
}
int getTab(int x,int y)
{
if(x<0 || y<0 || x>=MAXX || y>=MAXY)
return 0;
return zone[y][x];
}
int minVal(int a,int b)
{
// printf("A=%d,B=%d",a,b);
// ngetchx();
if(a==0 && b==0) return 0;
if(a==0) return b;
if(b==0) return a;
return a<b?a:b;
}
int calcZone()
{
int x,y;
int res=0;
int val=0;
int err=0;
clrscr();
printf("CALCZONE\n");
for(y=0;y<MAXY;y++)
for(x=0;x<MAXX;x++)
{
int value=zone[y][x];
int test=getTab(x-1,y);
if(value!=0)
{
if(test!=0 && test!=value)
err=1;
test=getTab(x+1,y);
if(test!=0 && test!=value)
err=1;
test=getTab(x,y-1);
if(test!=0 && test!=value)
err=1;
test=getTab(x,y+1);
if(test!=0 && test!=value)
err=1;
}
if(value>val)
{
val=value;
res++;
}
}
printf("Il y a %d zones\n",res);
if(err) printf("Il y a des anomalies\n");
while(ngetchx()!=KEY_ENTER){}
if(err) ret
Fonctions de parcours : void parcours1()
{
int x,y;
for(y=0;y<MAXY;y++)
{
for(x=0;x<MAXX;x++)
{
if(tab[y][x])
{
int a=getTab(x-1,y);
int b=getTab(x,y-1);
done=1;
zone[y][x]=minVal(a,b);
if(zone[y][x]==0)
zone[y][x]=current;
}
else
{
if(done)
{
done=0;
current++;
}
}
}// for x1
for(x=MAXX-1;x>=0;x--)
{
int a=getTab(x,y-1);
int b=minVal(a,getTab(x+1,y));
if(b!=0 && b<zone[y][x])
zone[y][x]=b;
}
}// for y
}
void parcours2()
{
int x,y;
for(x=MAXX-1;x>=0;x--)
{
for(y=MAXY-1;y>=0;y--)
{
int a=getTab(x+1,y);
a=minVal(a,getTab(x,y+1));
a=minVal(a,getTab(x-1,y));
if(a!=0 && a<zone[y][x])
zone[y][x]=a;
}// for y1
for(y=0;y<MAXY;y++)
{
int a=getTab(x,y-1);
a=minVal(a,getTab(x+1,y));
if(a!=0 && a<zone[y][x])
zone[y][x]=a;
}// for y2
}// for X
}
void parcours3()
{
int x,y;
for(x=0;x<MAXX;x++)
{
for(y=MAXY-1;y>=0;y--)
{
int a=getTab(x-1,y);
a=minVal(a,getTab(x,y+1));
if(a!=0 && a<zone[y][x])
zone[y][x]=a;
}// for y1
for(y=0;y<MAXY;y++)
{
int a=getTab(x,y-1);
if(a!=0 && a<zone[y][x])
zone[y][x]=a;
}//
Main : void _main()
{
LCD_BUFFER scrBuf;
LCD_save(scrBuf);
int essai=0;
current=1;
done=0;
show(1);
parcours1();
do
{
essai++;
parcours2();
parcours3();
show(0);
if(essai>1)
{
clrscr();
printf("Tentative %d",essai);
ngetchx();
}
}while(calcZone());
LCD_restore(scrBuf);
ST_eraseHelp();
ST_showHelp("Test