Forum Graph100

Forum Graph100

Vous n'êtes pas identifié.

Annonce

Bonjour et bienvenue sur le nouveau Forum Graph100 !
L'intégralité des données a été transférée sur un forum PunBB et tout les comptes sont fonctionnels avec le même nom d'utilisateur et mot de passe.
Un wiki est aussi disponible avec le même compte ! N'oubliez pas de remettre votre avatar, bon surf !
Pour plus d'informations, consultez ce post.

#1 04 Aug 2006 16:32:51

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Division par zero introuvable????

Code:

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

Code:

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)
http://img381.imageshack.us/img381/2372/sanstitreol7.png




Voila, vous en savez autant que moi, tachez de m'ouvrir les yeux

Merci d'avance

Hors ligne

 

#2 04 Aug 2006 18:12:19

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Division par zero introuvable????

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  yikes

Deuxième chose: tu devrais pouvoir te passer de la fonction power() pour gagner en performances. Essaie plutot une fonction comme

Code:

// 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);
}

wink


Pensez à surveiller mes releases wink

Hors ligne

 

#3 04 Aug 2006 18:44:28

tonton1664
Membre
Lieu: Somme (80)
Date d'inscription: 22 Jul 2002
Messages: 217
Site web

Re: Division par zero introuvable????

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 :

Code:

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

 

#4 05 Aug 2006 03:09:11

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: Division par zero introuvable????

les fonctions récursives sont peut etre à éviter sur G100...


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#5 05 Aug 2006 05:55:55

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: Division par zero introuvable????

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

 

#6 05 Aug 2006 06:28:22

tonton1664
Membre
Lieu: Somme (80)
Date d'inscription: 22 Jul 2002
Messages: 217
Site web

Re: Division par zero introuvable????

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

 

#7 05 Aug 2006 07:26:04

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Division par zero introuvable????

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 wink


Pensez à surveiller mes releases wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr