Si j'enlève le pointeur à la déclaration je me prend toute une série d'erreur à la compilation.
struct A{
int val;
};
int main(){
struct A a;
a.val=0;
return a.val;
}fatal_error a écrit:ben fais un truc simple dans un premier temps.
- Code: Tout sélectionner
struct A{
int val;
};
int main(){
struct A a;
a.val=0;
return a.val;
}
typedef struct
{
char* nom[21] ;
char* capitale[21] ;
int indicatif ;
} T_pays ;
void initRep(void)
{
T_pays france ,italie,espagne; /*seuls ces 3 pays figureront dans l'archive de départ*/
FILE *registre;
registre=fopen(LISTE,"w"); /* "w" on crée ou efface le fichier puis on le remplit*/
printf("test1\n");
italie.nom[21]="ITALIE";italie.capitale[21]="ROME";italie.indicatif=39;
espagne.nom[21]="ESPAGNE";espagne.capitale[21]="MADRID";espagne.indicatif=34;
france.nom[21]="FRANCE";france.capitale[21]="PARIS";france.indicatif=33;
fprintf(registre,"%s %s %d",italie.nom[21],italie.capitale[21],italie.indicatif); /*pour seulement 3 pays on ne surcharge pas avec un tableau*/
fprintf(registre,"%s %s %d",espagne.nom[21],espagne.capitale[21],espagne.indicatif);
fprintf(registre,"%s %s %d",france.nom[21],france.capitale[21],france.indicatif);
fclose(registre);
}fatal_error a écrit:es-tu sur de la déclaration de ta chaine de caractères?
struct A{
char* val[10];
};
int main()
{
struct A a;
a.val[10]="blabla";
printf("%s\n",a.val[10]);
return 0;
}Je n'avais pas vu que c'était un char* nom[21], pourquoi ce tableau de 21 pointeurs vers des chaînes de caractères ???joel76 a écrit:Il faut faire strcpy(italie.nom, "ITALIE"), etc, etc, italie.nom est l'adresse d'un tableau dans la structure T_Pays.
Le code d'avant plantait car les pointeur *italie etc étaient à NULL, il faut les allouer par un malloc
joel76 a écrit:Je n'avais pas vu que c'était un char* nom[21], pourquoi ce tableau de 21 pointur faire des chaînes de caractères ???
Pourquoi pas char nom[21] comme cela (me) semble plus simple ?
En plus en C, pour un tableau de 21 cases on va de 0 à 20 donc nom[21] est une adressse incorrecte.
italie.nom[21]="ITALIE" va faire des dégats en mémoire si ce n'est celui-la ce sera les suivants.
fatal_error a écrit:peux-tu montrer un code qui reproduit ton problème et le plus minimaliste/simplifié possible?
typedef struct
{
char* nom[21] ;
char* capitale[21] ;
int indicatif ;
} A ;
int main()
{
A a;
a.nom[21]="blabla";
a.capitale[21]="blabla2";
a.indicatif=5;
printf("%s %s %d\n",a.nom[21],a.capitale[21],a.indicatif);
return 0;
}test.c: In function main:
test.c:14:11: warning: assignment makes integer from pointer without a cast [enabled by default]
a.nom[21]="blabla";
^
test.c:15:16: warning: assignment makes integer from pointer without a cast [enabled by default]
a.capitale[21]="blabla2";
^
test.c:17:2: warning: format %s expects argument of type char *, but argument 2 has type int [-Wformat=]
printf("%s %s %d\n",a.nom[21],a.capitale[21],a.indicatif);
^
test.c:17:2: warning: format %s expects argument of type char *, but argument 3 has type int [-Wformat=]
typedef struct
{
char nom[21] ;
char capitale[21] ;
int indicatif ;
} A ;
int main()
{
A a;
strcpy(a.nom, "blabla");
strcpy(a.capitale, "blabla2");
a.indicatif=5;
printf("%s %s %d\n",a.nom,a.capitale,a.indicatif);
return 0;
}Non, les problèmes habituels des débutants en C !Merci encore du temps que vous passer sur mes problèmes farfelus ^^
Plus simple que ça je ne pourrais pas faire:
#include "stdio.h"
int main(){
char* nom[21];
nom[21]="blabla";
printf("%s",nom);
return 0;
}#include "stdio.h"
int main(){
char* nom[21];
nom[21]="blabla";
printf("%s",nom);
return 0;
}Non, les problèmes habituels des débutants en C !il faut la copier à l'adresse 0 du tableau
imprécisition de ma part, je m'excuse : j'aurais du écrire dans la case 0 du tableauil faut la copier à l'adresse 0 du tableau
Dans ma tête la chaine aurait marché comme ça:
a.nom[0] = 'b'
a.nom[1] = 'l'
a.nom[2] = 'a'
a.nom[3] = 'b'
a.nom[4] = 'l'
a.nom[5] = 'a'
Une chaine n'est elle pas un tableau de caractère au final
Pour ça que je ne comprends pas pourquoi a.nom[10]="blabla" ne peut pas marcher.
int main(){
char nom[1];
const char* b="blabla";
char test=(char)b;
nom[0]=b;//nom[0] contient test, à savoir l'addresse du tableau b tronquée dans un char
return 0;
}
nom[0] = "blabla" sera refusé à la compilationCode faux
void initRep(void)
{
FILE *registre;
registre=fopen(LISTE,"w"); /* "w" on crée ou efface le fichier puis on le remplit*/
T_pays france = {"FRANCE" , "PARIS" , 33};
T_pays italie = {"ITALIE","ROME",39};
T_pays espagne = {"ESPAGNE","MADRID",34}; /*seuls ces 3 pays figureront dans l'archive de départ*/
fprintf(registre,"%s %s %d\n",italie.nom,italie.capitale,italie.indicatif); /*pour seulement 3 pays on ne surcharge pas avec un tableau*/
fprintf(registre,"%s %s %d\n",espagne.nom,espagne.capitale,espagne.indicatif);
fprintf(registre,"%s %s %d\n",france.nom,france.capitale,france.indicatif);
fclose(registre);
}void verification()
{
FILE *registre;
registre=fopen(LISTE,"r"); /*on ouvre le fichier en lecture; on ne veut pas le modifier*/
char pays[21];
printf("Entrez un nom de pays (en majuscule) :\n");
scanf("%s",pays);
char test='n';
do /*ce do while parcourt bien le fichier du début à la fin ??? */
{
/*le corps de la fonction doit comparer pays avec ce qui est déjà écrit dans le fichier ligne par ligne
et accessoirement mot par mot*/
} while(!feof(registre));
fclose(registre);
}
La première solution serait de rentrer mes élément de structure du fichier dans un tableau; mais je me l'interdit car ce serait à mon avis "contourner" le problème et ce n'est pas le but de l'exercice.
void initRep(void)
{
size_t i;
A T[] = {{"FRANCE" , "PARIS" , 33},
{"ITALIE","ROME",39},
{"ESPAGNE","MADRID",34}};
FILE *registre;
registre=fopen(LISTE,"w"); /* "w" on crée ou efface le fichier puis on le remplit*/
// il faut toujours tester le retour de fopen, on ne sait jamais ce qui peut se passer
if (registre != NULL)
{
// sizeof(T)/sizeof(*T) donne le nombre d'élément du tableau
for(i = 0; i
}Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :