Vous n'êtes pas identifié.
// fonction qui affiche une valeur numerique decimale positive void writevalue(int x, int y, int value){ int j, spr, power; int size=1; int divider=10; int previous=0; while( (((value/divider)-(int)(value/divider))*divider) != value ){ size++; // a la fin de la boucle, size contient le nombre de caractere présent dans value divider+=10; } power = size-1; for(j=0 ; j<size ; j++){ // pour chaque caractère de la chaine spr = (int)(value/(pow(10,power))-previous); // on definit quel est le chiffre a utiliser gxSpr_noM_noC(x,y,Alphabet[spr]); // on affiche le caractère previous= spr*10; x=x+5; // sans oublier les espacements power--; // ni de reduire la puissance à utiliser } }
J'ai fait cette fonction un peu plus tot dans l'apres midi, elle est censée afficher le contenu d'un int quelque soit sa taille avec un alphabet fait maison. Seule problème, elle ne marche que lorsque value=0
Dans les autres cas, la calulette freeze completement, en WinG100 aussi, et dans 'erreur' j'ai
07FF : 1F47 divide error, divisor is 0
Mais j'ai beau chercher partout, je ne voit pas de diviseur par zero quan value != 0
En mode débuggage, WinG100 bloque sur (je vous met toutes les lignes en rouge)
Voila, vous en savez autant que moi, tachez de m'ouvrir les yeux
Merci d'avance
Hors ligne
Mouais, n'oublie quand même pas que A/B, lorsque A et B sont entiers, ça donne la division entière de A par B, et non la division exacte.
Par consequent ((value/divider)-(int)(value/divider)) ça fait toujours zero puisque value et divider sont des entiers.
Si ça freeze, c'est parce que ta caltoche est perdue dans une boucle infinie vu que la condition n'est jamais vraie
Deuxième chose: tu devrais pouvoir te passer de la fonction power() pour gagner en performances. Essaie plutot une fonction comme
// Affiche un nombre // Suppose qu'il affiche une autre fonction "text" qui affiche une string void text(int x,char y,int nombre) { int i,j,s=0,r; char st[10]; if (nombre<0) {st[0]='-'; s=1;nombre=-nombre; } r=nombre; for(j=1;r>9;j++) r/=10; for (i=0;i<j;i++) { st[j+s-i-1]='0'+nombre%10; nombre/=10; } st[s+j]=' '; text(x,y,st); }
Hors ligne
C'est tout simplement un piège classique du C : (value/divider) ne fait pas ce que tu pense. Le compilateur voit deux entiers, et le résultat de la division de deux entiers est un entier. Il faut convertir explicitement une des deux valeurs en float.
Le problème qui se pose est qu'une division de float sur la g100 c'est pas terrible, vu qu'il faut utiliser la librairie d'émulation qui prend beaucoup de place. Ici c'est possible de ne pas utiliser de floats :
// fonction qui affiche une valeur numerique decimale positive void writevalue(int x, int y, int value) { if(value == 0) { // on affiche le zero ici car writevalue2 quitte si value == 0 gxSpr_noM_noC(x, y, Alphabet[0]); return; } writevalue2(x, y, value); } // renvoie la derniere position de x utilisee int writevalue2(int x, int y, int value) { // terminer la recursivite if(value == 0) return; // afficher d'abord les chiffres les plus significatifs int lastx = writevalue2(x, y, value / 10); // et ensuite le chiffre courant gxSpr_noM_noC(lastx + 5, y, Alphabet[value % 10]); }
Non testé mais ca devrait ressembler a ca.
Hors ligne
Impeccable ta fonction Julien, Merci. J'avais pensé aussi à utiliser Itoa pour convertir mon int en string et utiliser writevalue, mais pas à ajouter chaque nombre dans le char comme ca. Bravo
J'espère que cela ne te dérange pas si j'utilise ta fonction dans mes prog???
Hors ligne
Pour maximum 6 appels récursifs ça gène pas trop, la pile n'est pas si petite que ça quand même. En plus, ça simplifie un peu l'algo, il n'y pas besoin de connaître la taille finale donc ça économise une boucle et ça t'évite d'avoir un tableau pour stocker (qui, au passage, est alloué dans la pile). A mon avis les 2 algos doivent utiliser a peu près autant de mémoire.
Hors ligne
J'espère que cela ne te dérange pas si j'utilise ta fonction dans mes prog???
Quelle question, bien sûr que non
Hors ligne