Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/04/2010, à 14:07

blinkO

[C] intialiser un tableau dans une structure

Salut voici ma structure :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
	typedef struct {int  a[4];} MEM;
	MEM memoire;
	memoire.a = {1,2,3,4};
	return 0;
}

Ou est l'erreur ? Dois-je faire un malloc ? Et donc mettre un pointeur de tableau à la place ?
Car ça ne compile pas chez moi.


<!> Ne vous laisser pas manipuler <!>
http://ralph.davidovits.net/contre-la-manipulation/des-masses.html

Hors ligne

#2 Le 12/04/2010, à 14:40

telliam

Re : [C] intialiser un tableau dans une structure

il faut faire l'initialisation et la déclaration sur la meme ligne

   MEM memoire = {{1,2,3,4}};

"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#3 Le 12/04/2010, à 14:41

credenhill

Re : [C] intialiser un tableau dans une structure

hello
il me semble que cette initialisation n'est valide que dans la déclaration
struct {int  a[4];} MEM = {1,2,3,4};

Hors ligne

#4 Le 12/04/2010, à 14:45

grim7reaper

Re : [C] intialiser un tableau dans une structure

Cette forme d'initialisation n'est valable que pour la déclaration et pas après.
Si tu veux l'initialiser après tu peux faire comme ça

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
    typedef struct {int  a[4];} MEM;
    MEM memoire;
    int i;
    for(i = 0 ; i < 4; i++)
    {
        memoire.a[i] = i + 1;
    }
    return 0;
}

Sinon tu peux utiliser la variante de telliam qui est correcte.

Hors ligne

#5 Le 12/04/2010, à 14:55

blinkO

Re : [C] intialiser un tableau dans une structure

ok merci a tous

mais voici ma structure et ce qui n'en compile pas exactement :

typedef struct { 
	int nb_lecteur;
	int nb_joueur;
	
	char * nom_joueur1[BUF_SIZE];
	char * prenom_joueur1[BUF_SIZE];
	int pion_trouvee_tab1[7];
	
	char * nom_joueur2[BUF_SIZE];
	char * prenom_joueur2[BUF_SIZE];
	int pion_trouvee_tab2[7];
	
	char * nom_joueur3[BUF_SIZE];
	char * prenom_joueur3[BUF_SIZE];
	int pion_trouvee_tab3[7];
	
	char * nom_joueur4[BUF_SIZE];
	char * prenom_joueur4[BUF_SIZE];
	int pion_trouvee_tab4[7];
	
	char * nom_joueur5[BUF_SIZE];
	char * prenom_joueur5[BUF_SIZE];
	int pion_trouvee_tab5[7];
	
	int repartition[4][4];

} MEM = { 0, 0,
	"", "", {0,0,0,0,0,0,0} ,
	"", "", {0,0,0,0,0,0,0} ,
	"", "", {0,0,0,0,0,0,0} ,
	"", "", {0,0,0,0,0,0,0},
	"", "", {0,0,0,0,0,0,0} ,
	{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}
};

Il semble qu'on ne puisse pas initialiser une structure comme tel.
Me tromperais-je ?

Dernière modification par blinkO (Le 12/04/2010, à 19:05)


<!> Ne vous laisser pas manipuler <!>
http://ralph.davidovits.net/contre-la-manipulation/des-masses.html

Hors ligne

#6 Le 12/04/2010, à 19:06

blinkO

Re : [C] intialiser un tableau dans une structure

up


<!> Ne vous laisser pas manipuler <!>
http://ralph.davidovits.net/contre-la-manipulation/des-masses.html

Hors ligne

#7 Le 12/04/2010, à 22:29

telliam

Re : [C] intialiser un tableau dans une structure

bien sur que si
mais la dans ton code tu confonds déclaration de type et initialisation de variable.

typedef struct { 
    int nb_lecteur;
    int nb_joueur;
    
    char * nom_joueur1[BUF_SIZE];
    char * prenom_joueur1[BUF_SIZE];
    int pion_trouvee_tab1[7];
    
    char * nom_joueur2[BUF_SIZE];
    char * prenom_joueur2[BUF_SIZE];
    int pion_trouvee_tab2[7];
    
    char * nom_joueur3[BUF_SIZE];
    char * prenom_joueur3[BUF_SIZE];
    int pion_trouvee_tab3[7];
    
    char * nom_joueur4[BUF_SIZE];
    char * prenom_joueur4[BUF_SIZE];
    int pion_trouvee_tab4[7];
    
    char * nom_joueur5[BUF_SIZE];
    char * prenom_joueur5[BUF_SIZE];
    int pion_trouvee_tab5[7];
    
    int repartition[4][4];

} MEM;
MEM toto = { 0, 0,
    "", "", {0,0,0,0,0,0,0} ,
    "", "", {0,0,0,0,0,0,0} ,
    "", "", {0,0,0,0,0,0,0} ,
    "", "", {0,0,0,0,0,0,0},
    "", "", {0,0,0,0,0,0,0} ,
    {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}
};

MEM est le type de ta structure
et toto la variable.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#8 Le 13/04/2010, à 01:37

blinkO

Re : [C] intialiser un tableau dans une structure

Et c'est pas possible qu'à chaque fois qu'on créé une structure de type MEM,
ça initialise par défaut les valeurs des variables comme je souhaite ?

Car enfaite dans ce que tu me dis, je dois initialiser les valeurs à chaque création d'une variable de type MEM.


<!> Ne vous laisser pas manipuler <!>
http://ralph.davidovits.net/contre-la-manipulation/des-masses.html

Hors ligne

#9 Le 13/04/2010, à 09:42

telliam

Re : [C] intialiser un tableau dans une structure

c'est possible si tu le compiles avec g++.
voici un lien qui t'expliquera comment faire :
http://www.yolinux.com/TUTORIALS/LinuxT … tures.html
mais attention il y a des restrictions.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#10 Le 13/04/2010, à 10:09

grim7reaper

Re : [C] intialiser un tableau dans une structure

telliam a écrit :

c'est possible si tu le compiles avec g++.

Compiler du C avec un compilo C++ est une mauvaise recommandation et est vraiment déconseillé.
Ce sont 2 langages différents.

Dernière modification par grim7reaper (Le 13/04/2010, à 10:10)

Hors ligne

#11 Le 13/04/2010, à 10:54

telliam

Re : [C] intialiser un tableau dans une structure

grim7reaper a écrit :
telliam a écrit :

c'est possible si tu le compiles avec g++.

Compiler du C avec un compilo C++ est une mauvaise recommandation et est vraiment déconseillé.
Ce sont 2 langages différents.

g++ le fait tres bien et de nombreux projets mixant le C et le C++ le font. Je suis tout a fait d'accord sur le fait que ce sont 2 langages différents.
en fait j'aurais du écrire : gcc ou lieu de g++ car comme l'indique la 1ère page de gcc: 'The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages'


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#12 Le 13/04/2010, à 11:10

grim7reaper

Re : [C] intialiser un tableau dans une structure

telliam a écrit :

g++ le fait tres bien et de nombreux projets mixant le C et le C++ le font.

Oui à condition de compiler le code C avec un compilo C et le code C++ avec un compilo C++.
Compiler du C avec g++ c'est n'importe quoi, essaye de faire l'inverse pour voir roll (du C++ avec gcc).
Certains le font et cela prouve juste qu'ils n'ont pas bien compris ce qu'est le C++.

comme l'indique la 1ère page de gcc: 'The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages'

Il y a gcc et gcc. Il y a gcc le projet, dont la définition est celle que tu donnes et il y à gcc la commande qui ne sert à compiler que du C (essaye de compiler un hello world en C++ avec gcc tu verras), ce n'est pas pour rien que les commandes g++, gfortran, gcj, gnat, ghdl, gdc, gpc, ... existent.

Hors ligne

#13 Le 13/04/2010, à 11:16

telliam

Re : [C] intialiser un tableau dans une structure

grim7reaper a écrit :
telliam a écrit :

g++ le fait tres bien et de nombreux projets mixant le C et le C++ le font.

Oui à condition de compiler le code C avec un compilo C et le code C++ avec un compilo C++.
Compiler du C avec g++ c'est n'importe quoi, essaye de faire l'inverse pour voir roll (du C++ avec gcc).
Certains le font et cela prouve juste qu'ils n'ont pas bien compris ce qu'est le C++.

j'ai jamais dit que l'inverse était possible.
Je veux bien te croire que c'est pas recommandé mais j'aimerai bien savoir pourquoi, si le compilo est capable de comprendre la syntaxe et de généré le code machine. pourquoi ne pas le faire?

grim7reaper a écrit :
telliam a écrit :

comme l'indique la 1ère page de gcc: 'The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages'

Il y a gcc et gcc. Il y a gcc le projet, dont la définition est celle que tu donnes et il y à gcc la commande qui ne sert à compiler que du C (essaye de compiler un hello world en C++ avec gcc tu verras), ce n'est pas pour rien que les commandes g++, gfortran, gcj, gnat, ghdl, gdc, gpc, ... existent.

Ok c'est vrai, un point pour toi smile


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#14 Le 13/04/2010, à 11:31

grim7reaper

Re : [C] intialiser un tableau dans une structure

telliam a écrit :

j'ai jamais dit que l'inverse était possible.
Je veux bien te croire que c'est pas recommandé mais j'aimerai bien savoir pourquoi, si le compilo est capable de comprendre la syntaxe et de généré le code machine. pourquoi ne pas le faire?

Justement, un compilo C++ ne peut pas toujours compiler du C (ça passe souvent car un certain niveau de compatibilité existe, mais pas toujours). De plus, certaines syntaxes n'ont pas la même signification et sont donc interprété différemment en C et en C++.
Il me semble qu'il y a également d'autres raisons mais je ne retrouve plus les liens qui en parlent et ma mémoire me fait défaut mad.
Cependant, les raisons précedemment cités sont suffisantes en ce qui me concerne (à moins de vouloir passer son temps à debugger d'obscur message d'erreur).

Essaye de compiler ce code avec g++ (et gcc si tu veux t'assurer de sa validité) et tu verras de quoi je veux parler smile.

#include <stdio.h>
#include <stdlib.h>

struct template 
{
    int new;
    struct template* class;
};

int main(void)
{
    /* Initialisation "rapide" d'un tableau de char => sans \0 */
    char tata[6] = "ubuntu";
    /* Conversion implicite de void* */
    int* toto = malloc(42 * sizeof *toto);


    return EXIT_SUCCESS;
}

Hors ligne

#15 Le 13/04/2010, à 11:59

telliam

Re : [C] intialiser un tableau dans une structure

grim7reaper a écrit :
telliam a écrit :

j'ai jamais dit que l'inverse était possible.
Je veux bien te croire que c'est pas recommandé mais j'aimerai bien savoir pourquoi, si le compilo est capable de comprendre la syntaxe et de généré le code machine. pourquoi ne pas le faire?

Justement, un compilo C++ ne peut pas toujours compiler du C (ça passe souvent car un certain niveau de compatibilité existe, mais pas toujours). De plus, certaines syntaxes n'ont pas la même signification et sont donc interprété différemment en C et en C++.
Il me semble qu'il y a également d'autres raisons mais je ne retrouve plus les liens qui en parlent et ma mémoire me fait défaut mad.
Cependant, les raisons précedemment cités sont suffisantes en ce qui me concerne (à moins de vouloir passer son temps à debugger d'obscur message d'erreur).

Essaye de compiler ce code avec g++ (et gcc si tu veux t'assurer de sa validité) et tu verras de quoi je veux parler smile.

#include <stdio.h>
#include <stdlib.h>

struct template 
{
    int new;
    struct template* class;
};

int main(void)
{
    /* Initialisation "rapide" d'un tableau de char => sans \0 */
    char tata[6] = "ubuntu";
    /* Conversion implicite de void* */
    int* toto = malloc(42 * sizeof *toto);


    return EXIT_SUCCESS;
}

tout dépend comment tu configures ton compilo g++ mais si la personne connait et maitrise les limitations liés aux fait d'utiliser g++ pour du C, c'est tout a fait utilisable.
pour preuve le compilo g++ permet d'indiquer quel standard C on veut suivre :
http://linux.die.net/man/1/g++

C Language Options
    -ansi -std=standard -fgnu89-inline -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fhosted -ffreestanding -fms-extensions -trigraphs -no-integrated-cpp -traditional -traditional-cpp -fallow-single-precision -fcond-mismatch -fsigned-bitfields -fsigned-char -funsigned-bitfields -funsigned-char
C-only Warning Options
    -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wdeclaration-after-statement -Wpointer-sign

Je comprends et j'approuve le fait que ce n'est pas conseillé, mais pour la question qui était posé je ne connais que cette façon de faire.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#16 Le 13/04/2010, à 12:35

grim7reaper

Re : [C] intialiser un tableau dans une structure

telliam a écrit :

tout dépend comment tu configures ton compilo g++ mais si la personne connait et maitrise les limitations liés aux fait d'utiliser g++ pour du C, c'est tout a fait utilisable.
pour preuve le compilo g++ permet d'indiquer quel standard C on veut suivre :
http://linux.die.net/man/1/g++

C Language Options
    -ansi -std=standard -fgnu89-inline -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fhosted -ffreestanding -fms-extensions -trigraphs -no-integrated-cpp -traditional -traditional-cpp -fallow-single-precision -fcond-mismatch -fsigned-bitfields -fsigned-char -funsigned-bitfields -funsigned-char
C-only Warning Options
    -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wdeclaration-after-statement -Wpointer-sign

Non ça ne fonctionne pas. Si tu passe l'option std=c89 à g++ tu auras une sortie du genre :

g++ a écrit :

cc1plus: attention : l'option de la ligne de commande "-std=c89" est valide pour C/ObjC mais pas pour C++

Tu ne peux pas faire n'importe quoi. Les comportements que je cite sont spécifié dans la norme du langage et un compilo se doit de respecter la norme. g++ étant un compilo C++ (un frontend a cc1plus pour être exact) il respecte cet norme et tu ne peux pas le forcer à ignorer certains point comme cela t'arrange.

telliam a écrit :

Je comprends et j'approuve le fait que ce n'est pas conseillé, mais pour la question qui était posé je ne connais que cette façon de faire.

C'est simple.
En C c'est impossible (tu peux toujours faire une fonction init_MEM à utiliser à chaque creation de variable de type MEM mais c'est au programmeur d'y faire explicitement appel, rien d'automatique dans tout cela smile), mais en C++ c'est faisable.

Il faut choisir son "camp" en fonction des objectifs et exigences du problème et ne pas essayer d'utiliser un horrible, et peu recommandable, sabir C/C++ en tentant de faire compiler du C avec un compilateur C++.

Donc soit il conserve cette idée et change de langage, soit il reste dans le C et s'adapte smile.
Tout les langages ont leurs limites, il faut les comprendre et les accepter, sinon on ne produit rien de bon.

Hors ligne

#17 Le 13/04/2010, à 13:25

blinkO

Re : [C] intialiser un tableau dans une structure

Salut et merci pour toute vos réponses (troll tongue), et je me dois de donner plus d'explication pour être plus claire.

Je rejoins l'idée d'utiliser gcc pour compiler du C et c'est d'ailleur le langage que j'utilise et je ne peux pas utiliser le C++. (cas d'école)

Revenons en à nos moutons, pour cette structure j'ai trouver une autre solution qui consiste tout simplement à initialiser la structure après la déclaration de la structure. Cela avec une variable du type MEM.

Ca fonctionne comme ça et je pense que cette façon de faire rend le code plus compréhensif pour un oeuil non avertis.

typedef struct { 
	int nb_lecteur;
	int nb_joueur;
	
	char nom_joueur1[BUF_SIZE];
	char prenom_joueur1[BUF_SIZE];
	int pion_trouvee_tab1[7];
	
	char nom_joueur2[BUF_SIZE];
	char prenom_joueur2[BUF_SIZE];
	int pion_trouvee_tab2[7];
	
	char nom_joueur3[BUF_SIZE];
	char prenom_joueur3[BUF_SIZE];
	int pion_trouvee_tab3[7];
	
	char nom_joueur4[BUF_SIZE];
	char prenom_joueur4[BUF_SIZE];
	int pion_trouvee_tab4[7];
	
	char nom_joueur5[BUF_SIZE];
	char prenom_joueur5[BUF_SIZE];
	int pion_trouvee_tab5[7];
	
	int repartition1[4];
	int repartition2[4];
	int repartition3[4];
	int repartition4[4];
	
} MEM;

	MEM memoire = { 200, 300 ,
	{"Unknown"} , {"Unknown"} , {0,0,0,0,0,0,0} ,
	{"Unknown"} , {"Unknown"} , {0,0,0,0,0,0,0} ,
	{"Unknown"} , {"Unknown"} , {0,0,0,0,0,0,0} ,
	{"Unknown"} , {"Unknown"} , {0,0,0,0,0,0,0} ,
	{"Unknown"} , {"Unknown"} , {0,0,0,0,0,0,0} ,
	{1,2,1,2} , {1,2,1,2} , {1,2,1,2} , {1,2,1,2}};

Voila pour ceux que ca intéresse.

Dernière modification par blinkO (Le 13/04/2010, à 13:33)


<!> Ne vous laisser pas manipuler <!>
http://ralph.davidovits.net/contre-la-manipulation/des-masses.html

Hors ligne