Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afichage bizarre

    15 juin 2006 à 2:03:19

    Lorsque j'execute le code suivant :
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE_MOT 16

    typedef struct
    {
        char cache[TAILLE_MOT];
        char ncache[TAILLE_MOT];
    } sMot;

    sMot init_mot ( void )
    {
        sMot mot;
        for ( char i = 0; i < TAILLE_MOT; i++ )
        {
            mot.cache[i] = '\0';
            mot.ncache[i] = '\0';
        }
        return mot;
    }


    int main ( void )
    {
        sMot mot = init_mot ( );

        printf ( "Mot cache : %s", mot.cache );
        printf ( "Mot apparent : %s", mot.ncache );

        return EXIT_SUCCESS;
    }

    J'ai "Mot cache : " et "Mot apparent : " qui s'affichent, suivit de caractères qui semblent aléatoires. Certainement ce qui se trouve en mémoire... Mais comment cela est il possible, étant donné que je met toute la chaine à 0 ?

    Je n'arrive pas du tout à savoir d'où vient le probleme, le code étant... trivial.
    Quelqu'un peut m'aider ?

    EDIT : Euh, probleme d'affichage... o_O
    EDIT2 : J'ai voulu écrire ce qu'affiche la fonction, mais ça a rendu le message illisible... Et désolé pour le "Afichage" en titre, ça fait tâche... :-°:-°
    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2006 à 8:20:43

      int i = 0;
      for ( i = 0; i < TAILLE_MOT; i++ )

      i n'est pas un caractére, c'est un nombre qui sert repérer les caractéres dans le tableau.
      Et écrit les déclarations de variables au début de la fonction ^^
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        15 juin 2006 à 8:46:32

        Mais, on peu très bien utiliser un char comme nombre (allant de -125 à 126 pour un signed et de 0 à 256 pour un unsigned.

        Le problème, c'est que tu appelle la fonction, tu crée une structure dedans, mais lorsque la fonction init_mot a terminé son travail, elle ne retourne rien, et la structure est supprimée.
        Ce que tu modifie dans cette fonction, ce n'est pas la structure déclarée dans le main.
        Pour cela, il faut utiliser les pointeurs


        #include <stdio.h>
        #include <stdlib.h>
        #define TAILLE_MOT 16

        typedef struct
        {
            char cache[TAILLE_MOT];
            char ncache[TAILLE_MOT];
        };

        void init_mot ( struct sMot* mot  )
        {
            for ( char i = 0; i < TAILLE_MOT; i++ )
            {
                mot->cache[i] = '\0';
                mot->ncache[i] = '\0';
            }
        }


        int main ( void )
        {
            struct sMot mot;
            init_mot (mot);

            printf ( "Mot cache : %s", mot.cache );
            printf ( "Mot apparent : %s", mot.ncache );

            return EXIT_SUCCESS;
        }

        Ca devrait être dans ce genre là (il y a peut être des erreurs, mais je doit partir là, je regarderait ça plus en profondeur cet après-midi)
        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2006 à 18:30:40

          En ce qui concerne le type char, désolé si ça choque certains, m'entrainant à programmer pour du matériel embarqué, j'ai pris l'habitude d'optimiser au maximum l'utilisation mémoire. En particulier utiliser des char pour les indices de boucles. Le type char n'étant qu'un int codé sur un octet (au lieu de 4, pour la plupart des implémentations).

          Pour la déclaration de variable, désolé, c'est une question d'habitude à programmer en C99 ; je trouve plus lisible un code dans lequel les variables sont initialisées lors de leur utilisation, et pas au début de la fonction.

          Quand au return, désolé, il est présent dans le code ; mais j'ai eu des problemmes pour poster le message, et en modifiant le tout, j'ai du l'enlever involontairement... Je modifie mon premier post pour le rajouter.


          Du coup, quelqu'un a t'il une idée ?
          • Partager sur Facebook
          • Partager sur Twitter

          Afichage bizarre

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown