Structures et tableaux, la galère
Salut !!
je voudrais savoir si il y a des spécificitées lorsque l'on travaille avec une structure, composée d'autres structures, elles-mêmes contenant des tableaux (je m'explique...):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| typdef struct
{
short sLen;
char *pszValeur;
} Struct1;
typedef struct
{
Struct1 stVal1;
Struct1 stVal2;
Struct1 stVal3[10];
} Struct2;
typedef struct
{
Strcut2 *pstVal1; // Tableau dont on ne connait pas la taille
Strcut2 stVal2;
} Struct3; |
dans mon code, j'ai ca:
Code:
1 2 3 4 5 6 7
| int main(...)
{
Struct3 stVal;
memset( &stVal, '\0', sizeof(Struct3) );
maFonction( &stVal );
} |
aussi, mes sous structures sont-elles initialisées ??
les tableaux des sous-structures le sont-ils ?
d'avance merci !
Re: Structures et tableaux, la galère
Citation:
Envoyé par kameha
je voudrais savoir si il y a des spécificitées lorsque l'on travaille avec une structure, composée d'autres structures, elles-mêmes contenant des tableaux (je m'explique...):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| typdef struct
{
short sLen;
char *pszValeur;
} Struct1;
typedef struct
{
Struct1 stVal1;
Struct1 stVal2;
Struct1 stVal3[10];
} Struct2;
typedef struct
{
Strcut2 *pstVal1; // Tableau dont on ne connait pas la taille
Strcut2 stVal2;
} Struct3; |
dans mon code, j'ai ca:
Code:
1 2 3 4 5 6 7
| int main(...)
{
Struct3 stVal;
memset( &stVal, '\0', sizeof(Struct3) );
maFonction( &stVal );
} |
aussi, mes sous structures sont-elles initialisées ??
les tableaux des sous-structures le sont-ils ?
d'avance merci !
Ce n'est pas la bonne façon d'initialiser une structure à 0 (pas portable). Il faut plutôt faire ceci :
Code:
1 2 3 4 5 6
| int main(...)
{
Struct3 stVal = {0};
maFonction( &stVal );
} |
Ceci a pour effet de mettre tout les champs à 0 (logique), y compris les pointeurs qui seront à NULL et les champs des structures et tableaux imbriquées.
Re: Structures et tableaux, la galère
Ok, merci pour ces éclaircissements...
continuons donc avec les questions ;-)...
je reprend ma Struct3:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
typedef struct
{
Strcut2 *pstVal1; // Tableau dont on ne connait pas la taille
Strcut2 stVal2;
} Struct3;
.
.
.
.
.
Struct3 stVal = {0};
maFonction( &stVal ); |
Si j'ai bien tout compris, pour ajouter de nouvelles occurences de Struct2 dans pstVal1, je peux dans la fonction maFonction faire ceci:
Code:
1 2 3 4 5 6 7
| void maFonction ( Struct3 *pstStruct )
{
Struct2 stVal[10] = {0};
// Je rempli mon tableau de structure
memcpy( pstStruct, stVal, sizeof(stVal) );
} |
est-ce correct ??
merci
Re: Structures et tableaux, la galère
Citation:
Envoyé par kameha
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
typedef struct
{
Strcut2 *pstVal1; // Tableau dont on ne connait pas la taille
Strcut2 stVal2;
} Struct3;
Struct3 stVal = {0};
/* -ed- maintenant, stVal.pstVal1 vaut NULL */
maFonction( &stVal );
void maFonction ( Struct3 *pstStruct ){
Struct2 stVal[10] = {0};
// Je rempli mon tableau de structure
memcpy( pstStruct, stVal, sizeof(stVal) );
} |
est-ce correct ??
Ben non. memcpy() permet de faire n'importe quoi, notamment d'écraser des données existantes. Là, tu ne t'es pas loupé. Le comportement est indéfini...
Il faut allouer un bloc avec malloc(), et stocker son adresse dans le pointeur prévu à cet effet. (Il est pratique aussi de stocker la taille ou le nombre d'élements alloués, afin de pouvoir se prémunir des débordements de tableau toujours possibles...)