Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme lors de la compilation du programme

Surement une mauvaise initialisation d'un tableau

Sujet résolu
    30 avril 2019 à 12:46:51

    Bonjour,

    je viens vers vous aujourd'hui car j'ai un problème ...

    Vous vous en doutez surement; mon programme ne compile pas et j'aimerai vraiment comprendre la raison ...

    Je pense avoir mal déclaré mon tableau dans mon main mais bon je ne vois pas comment le faire autrement ...

    Je vous remercie sincèrement si vous arrivez à m'éclairer :)

    #include <stdio.h>
    #define NB_PLANETES 8
    
    typedef struct planete planetes;
    struct planete {
    	char nom;
        float densite;
        float distance_soleil;
        int nombre_de_satelites;
    };
    
    void affichePlanete(){
    	planetes systemeSolaire[NB_PLANETES];
    	int i;
    	printf("Donnes moi le numero de la planete que tu veux :\n 1.Mercure\n2.Venus\n3.Terre\n4.Mars\n5.Jupiter\n6.Saturne\n7.Uranus\n8.Neptune\n");
    	scanf("%d", &i);
    	printf("le nom de la planete est : %c, sa densite : %f, sa distance par rapport au soleil est : %f et le nombre de ses satelites est : %d\n", systemeSolaire[i].nom, systemeSolaire[i].densite, systemeSolaire[i].distance_soleil, systemeSolaire[i].nombre_de_satelites);
    }
    
    int main(){
    	planetes systemeSolaire[NB_PLANETES] = {
    		{"Mercure", 5.42, 58, 0},
            {"Venus", 5.25, 108.2, 0},
            {"Terre", 5.52,149.6,1},
            {"Mars",3.94,227.9,2},
            {"Jupiter",1.314,778.3,16},
            {"Saturne",0.69,1427,17},
            {"Uranus",1.19,2869,15},
            {"Neptune",1.6,4496,2}};
    
    affichePlanete();
    
    return 0;
    }
    
    
    



    -
    Edité par GabrielBenhamou 30 avril 2019 à 12:54:05

    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2019 à 13:46:49

      Tu t'en doutes sûrement, si ça ne compile pas il y a un message d'erreur, et il faut le lire, parce qu'il explique le problème.

      Si tu ne le comprends pas, on peut t'aider à condition que tu le copies ici, en précisant les lignes qui sont concernées.

      Mais rien qu'en faisant l'effort de le copier, tu verras certainement de quoi il s'agit.

      -
      Edité par michelbillaud 30 avril 2019 à 13:50:24

      • Partager sur Facebook
      • Partager sur Twitter
        30 avril 2019 à 23:53:19

        Merci beaucoup pour ta réponse,

        Voici le message d'erreur qui se répète pour chaque planete (soit 8 fois) :

        moi.c:22:4: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
           {"Mercure", 5.42, 58, 0},
            ^~~~~~~~~
        moi.c:22:4: note: (near initialization for 'systemeSolaire[0].nom')
        moi.c:23:10: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
                 {"Venus", 5.25, 108.2, 0},
                  ^~~~~~~

        Je n'ai sincèrement aucune idée de ce que ça veut bien pouvoir dire :o ? As tu une idée ?

        Merci beaucoup pour ton aide et désolé de répondre si tardivement ^^

        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2019 à 8:23:02

          Regarde la petite flèche ^---- sous le message elle te dit où ça se passe.

          Ça se passe sur les chaînes de caractères, ok ?

          Et le message te parle de l'initialisation du champ nom de systemesolaire[0]

          Et d'un pointeur qu'on ne peut pas mettre dans un entier sans conversion (cast). Tu as tous les éléments, si tu te rappelles qu'en C un char est un petit entier codé sur un octet.

          Maintenant faut faire mouliner les neurones.

          ----

          Tu as déclaré nom de type char, et tu veux y mettre une chaîne, qui est un pointeur de char.  Comment veux tu que "Mercure" rentre dans un caractère ? 

          ----

          Donc il faut que tu corriges ta déclaration de nom pour en faire

          • Soit un tableau de caractères avec un certaine taille
          • Soit un pointeur de char

          -----

          Une fois que tu auras corrigé ça, ça ne marchera toujours pas, rapport à partage/transmission d'informations entre fonctions. Chaque chose en son temps.

          -
          Edité par michelbillaud 1 mai 2019 à 8:34:45

          • Partager sur Facebook
          • Partager sur Twitter
            1 mai 2019 à 11:10:04

            Merci beaucoup !

            Dans ma structure, j'ai fait un tableau de type char, et j'ai remplacé le "%c" par un "%s" à la ligne 17. Ca m'a enlevé beaucoup d'erreurs ! Il m'en restait plus qu'une :)

            La voici : moi.c:21:11: warning: unused variable 'systemeSolaire' [-Wunused-variable]
              planetes systemeSolaire[NB_PLANETES] = {

            voici le code après petites modification :

            #include <stdio.h>
            #define NB_PLANETES 8
            
            typedef struct planete planetes;
            struct planete {
            	char nom[20];
                float densite;
                float distance_soleil;
                int nombre_de_satelites;
            };
            
            void affichePlanete(){
            	planetes systemeSolaire[NB_PLANETES];
            	int i;
            	printf("Donnes moi le numero de la planete que tu veux :\n 1.Mercure\n2.Venus\n3.Terre\n4.Mars\n5.Jupiter\n6.Saturne\n7.Uranus\n8.Neptune\n");
            	scanf("%d", &i);
            	printf("le nom de la planete est : %s, sa densite : %f, sa distance par rapport au soleil est : %f et le nombre de ses satelites est : %d\n", systemeSolaire[i].nom, systemeSolaire[i].densite, systemeSolaire[i].distance_soleil, systemeSolaire[i].nombre_de_satelites);
            }
            
            int main(){
            	planetes systemeSolaire[NB_PLANETES] = {
            		{"Mercure", 5.42, 58, 0},
                    {"Venus", 5.25, 108.2, 0},
                    {"Terre", 5.52,149.6,1},
                    {"Mars",3.94,227.9,2},
                    {"Jupiter",1.314,778.3,16},
                    {"Saturne",0.69,1427,17},
                    {"Uranus",1.19,2869,15},
                    {"Neptune",1.6,4496,2}};
            
            affichePlanete();
            
            return 0;
            }
            
            
            

            Comme c'était un warning j'ai exécuté mon programme, le début fonctionnait mais au moment d'afficher ce que je demandais il y avait des résultats étranges qui apparaissaient :(

            "le nom de la planete est : , sa densite : 0.000000, sa distance par rapport au soleil est : 0.000000 et le nombre de ses satelites est : -2"

            voila le message qui était affiché ...

            J'ai essayé de comprendre et j'ai fini par y arriver !

            voila le code final :

            #include <stdio.h>
            #define NB_PLANETES 8
            
            typedef struct planete planetes;
            struct planete {
                char nom[20];
                float densite;
                float distance_soleil;
                int nombre_de_satelites;
            };
            
            void affichePlanete(planetes systemeSolaire[]){
            	
            	int i;
            	printf("Donnes moi le numero de la planete que tu veux :\n1.Mercure\n2.Venus\n3.Terre\n4.Mars\n5.Jupiter\n6.Saturne\n7.Uranus\n8.Neptune\n");
            	scanf("%d", &i);
            	printf("le nom de la planete est : %s, sa densite : %f, sa distance par rapport au soleil est : %f et le nombre de ses satelites est : %d\n", systemeSolaire[i].nom, systemeSolaire[i].densite, systemeSolaire[i].distance_soleil, systemeSolaire[i].nombre_de_satelites);
            }
            
            int main(){
            	planetes systemeSolaire[NB_PLANETES] = {
            		{"Mercure", 5.42, 58, 0},
                    {"Venus", 5.25, 108.2, 0},
                    {"Terre", 5.52,149.6,1},
                    {"Mars",3.94,227.9,2},
                    {"Jupiter",1.314,778.3,16},
                    {"Saturne",0.69,1427,17},
                    {"Uranus",1.19,2869,15},
                    {"Neptune",1.6,4496,2}};
            
            affichePlanete(systemeSolaire);
            
            return 0;
            }

            Merci infiniment pour ton aide en tout cas ! (Si tu as qq idées pour améliorer ce code :) je suis preneur !)

            -
            Edité par GabrielBenhamou 1 mai 2019 à 11:28:20

            • Partager sur Facebook
            • Partager sur Twitter
              1 mai 2019 à 23:55:04

              Hello,

              Voilà ton code légèrement modifié :

              J'ai retiré NB_PLANETES : ça ne sert pas à grand chose ici, en fait si tu mets juste systemeSolaire[] = {....} il va inférer la taille du tableau tout seul.

              J'ai également écrit en plusieurs lignes le printf. En général c'est mieux quand on a du code qui fait moins de 80 caractères - ou en tout cas, moins de 100. L'idéal est que tu dois être capable de lire la ligne sans avoir besoin de scroller gauche/droite.

              Bon, j'avoue, mes commentaires dépassent très largement cette limite - mais c'est pour bien marquer là où j'ai fait les changements ;) dans un vrai code j'aurais mis les commentaires à part. N'hésite pas si tu as des questions ! Et pense bien à "protéger" le scanf comme j'ai fait. Tu ne sais jamais ce que l'utilisateur peut rentrer ! En l'occurence avec ton code il pouvait provoquer un seg fault. La règle d'or en programmation est de supposer que l'utilisateur peut rentrer absolument n'importe quoi.

              #include <stdio.h>
               
              typedef struct planete planete; // la structure représente une planète, et non des planètes
              struct planete {
                  char nom[20];
                  float densite;
                  float distance_soleil;
                  int nbr_satellites; // le nom précédent était un peu trop long et avait une faute
              };
               
              void affichePlanete(planete systemeSolaire[]){
                  int i;
              
                  printf("Donnes moi le numero de la planete que tu veux :\n"
                          "1.Mercure\n 2.Venus\n 3.Terre\n 4.Mars\n5.Jupiter\n6.Saturne"
                          "\n7.Uranus\n8.Neptune\n");
                  do {
                      scanf("%d", &i);
                  } while ( ! (i >= 1 && i <= 8) ); // boucle do..while pour éviter que l'utilisateur rentre n'importe quoi et te fasse faire un débordement de tableau
                  i = i-1; // ne pas oublier qu'un tableau démarre à 0
                  printf("le nom de la planete est : %s, sa densite : %f, sa distance"
                          "par rapport au soleil est : %f et le nombre de ses satellites"
                          "est : %d\n", systemeSolaire[i].nom, systemeSolaire[i].densite,
                          systemeSolaire[i].distance_soleil, systemeSolaire[i].nbr_satellites);
              }
               
              int main(){
                  planete systemeSolaire[] = {
                      {"Mercure", 5.42,   58,     0}, // j'ai réarrangé l'espacement pour que ce soit plus joli :-)
                      {"Venus",   5.25,   108.2,  0},
                      {"Terre",   5.52,   149.6,  1},
                      {"Mars",    3.94,   227.9,  2},
                      {"Jupiter", 1.314,  778.3,  16},
                      {"Saturne", 0.69,   1427,   17},
                      {"Uranus",  1.19,   2869,   15},
                      {"Neptune", 1.6,    4496,   2}};
               
                  affichePlanete(systemeSolaire);
               
                  return 0;
              }
              

              PS : petit commentaire sur comment j'ai splitté le printf : en C quand tu mets deux chaines constantes l'une après l'autre sans aucun opérateur, ça va te concaténer les deux. C'est à dire que "tata" "toto" est absolument équivalent à écrire "tatatoto". ça ne marche qu'avec les chaines constantes (écrites avec des guillemets) et c'est bien pratique pour séparer en plusieurs lignes les gros textes.

              -
              Edité par potterman28wxcv 1 mai 2019 à 23:59:06

              • Partager sur Facebook
              • Partager sur Twitter
                2 mai 2019 à 0:45:28

                -

                -
                Edité par edgarjacobs 2 mai 2019 à 0:47:12

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  2 mai 2019 à 10:04:14

                  Le systeme solaire étant peu susceptible d'évoluer dans un futur proche au moins, ça pourrait être un tableau constant, qui peut être une variable globale. L'utilisation de typedef est une sale manie.

                    
                  struct planete {
                      char nom[20];
                      float densite;
                      float distance_soleil;
                      int nbr_satellites; 
                  };
                  
                  const struct planete systemeSolaire[] = {
                          {"Mercure", 5.42,   58,     0}, // j'ai réarrangé l'espacement pour que ce soit plus joli :-)
                          {"Venus",   5.25,   108.2,  0},
                          {"Terre",   5.52,   149.6,  1},
                          {"Mars",    3.94,   227.9,  2},
                          {"Jupiter", 1.314,  778.3,  16},
                          {"Saturne", 0.69,   1427,   17},
                          {"Uranus",  1.19,   2869,   15},
                          {"Neptune", 1.6,    4496,   2}
                  };
                    



                  Le passer en paramètre ou pas, faut voir si on envisage de traiter plusieurs systèmes ou pas.

                  Dans ce cas, envisager une structure pour représenter un système, avec un nom, le tableau de planetes, etc.

                  struct systeme {
                      char *nom;
                      int  nbr_planetes;
                      struct planete *planetes;
                  };
                  




                  revoir le nom donné à la fonction affichePlanete parce qu'elle fait plus que ça

                  • demander un entier
                  • afficher la planete correspondante.
                  • boucler

                  Pour afficher les choix qu'elle propose, elle devrait piocher dans le tableau. (c'est évident si on considère qu'elle devrait pouvoir traiter les planetes d'une autre étoile)



                  -
                  Edité par michelbillaud 2 mai 2019 à 10:07:37

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2019 à 23:39:52

                    Merci beaucoup ! :p

                    Vous êtes incroyable !

                    Vraiment merci infiniment !

                    ps : Merci pour le code potterman28wxcv, je vais bien l'analyser et merci pour le printf ! En effet, j'avais essayer de faire en plusieurs lignes mais ça ne marchait pas ...

                    Et merci beaucoup Michelbillaud pour les conseils j'en prendrai compte !

                    -
                    Edité par GabrielBenhamou 2 mai 2019 à 23:42:41

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mai 2019 à 23:42:47

                      N'hésite pas si tu as des questions. Et n'oublie pas de mettre le sujet en "résolu" si il est résolu :)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Probleme lors de la compilation du programme

                      × 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