Forum Programmation.c arrachage de cheveux avec des scanf !!!

Posté par  .
Étiquettes : aucune
0
28
juin
2004
Bonsoir...

J'ai une petite question de Lead Architect à vous poser. Dans le but d'apprendre un peu à utiliser un peu la GLib, j'ai écrit le bout de code suivant pour tester les listes chainées :*

#include <stdio.h>
#include <glib.h>


int cmpfunc(unsigned short int *p1, unsigned short int * p2) {
if(*p1 > *p2) return 1;
else return -1;
}

int main(void) {
gushort compteur;
gushort maxcount;
gushort nombre;
GSList *maListe = NULL;

printf("Combien de nombres voulez vous saisir ? ");
scanf("%d", &maxcount);
for(compteur=0; compteur<maxcount; compteur++) {
printf("\nNombre %d ? ", compteur+1);
scanf("%d", &nombre);
//maListe = g_slist_insert_sorted(maListe, &nombre, (GCompareFunc) cmpfunc);
}

return 0;

}


pour saisir une liste de nombres à placer dans une liste chainée...

Or, j'obtiens toujours un truc du style :
(gdb) run
Starting program: /home/yves/glibTests/insertSorted
Combien de nombres voulez vous saisir ? 5

Nombre 1 ? 3

Program exited normally.
(gdb)


Je désespère... et je vais me lancer dans le Java si ça continue !!!
  • # probleme avec les gushort

    Posté par  . Évalué à 1.

    essaye avec des guint, ca marchera peut etre.
    Chez moi ton code fait le meme effet, alors que

    int main(void)
    {
    int compteur;
    int maxcount;
    int nombre;
    printf("Combien de nombres voulez vous saisir ? ");
    scanf("%d", &maxcount);
    for(compteur=0; compteur<maxcount; compteur++)
    {
    printf("\nNombre %d ? ", compteur+1);
    scanf("%d", &nombre);
    }
    return 0;
    }

    marche nickel. Peut etre que le for n'aime pas les (gu)short ... Je dis ca, mais je suis loin d'etre un Lead Architect :)


    PS : c'est chiant qu'il saute des lignes comme ca., ca fait pas propre.
  • # Ta mere en short ...

    Posté par  (site web personnel) . Évalué à 3.

    Tu utilises des unsigned short... Donc, soit cohérent, utilise %hd dans tes scanf/printf, ou alors utilise des int, et ca passera beaucoup mieux...
  • # warning gcc

    Posté par  . Évalué à 2.

    Compiles avec "-Wall" et gcc te dira :
    fichier.c:XX: attention : format int, arg type différent (arg 2)

    Ce sont tes scanf qui déconnent.
    • [^] # Re: warning gcc

      Posté par  . Évalué à 1.

      [+1]

      - toujours compiler avec -Wall
      - ne jamais utiliser scanf()
  • # ça marche :o)

    Posté par  . Évalué à 1.

    Merci à tous !

    Effectivement, ça marche beaucoup mieux avec des %hd. Je me doutais que ça venait du scanf parce que la boucle se faisait correctement lorsque je l'enlevais ! (D'ailleurs, d'après la page man de scanf, c'est plutot %hu pour des unsigned short int -- le "h" étant pour des short si j'ai bien compris)

    Et merci aussi pour l'option -Wall, que je ne connaissais pas et qui est d'un grand secours. Elle devrait être activée par défaut :)
  • # Documente toi

    Posté par  . Évalué à 1.

    1) rajoute un fflush(stdout); après ton printf ne se terminant pas par un '\n'
    2) le format n'est pas bon ->'%h'
    3) ton utilisation de GSList est mauvaise. déjà ta fonction ne respecte pas le bon prototype. Conforme toi à la documentation. Après, il te faut soit alouer chaque nombre que tu mets dans ta liste, soit utiliser GINT_TO_POINTER

    RTFM en gros :D

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.