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
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 ? As tu une idée ?
Merci beaucoup pour ton aide et désolé de répondre si tardivement
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.
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
#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 !)
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.
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.
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)
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 !
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
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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent