Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

initialisation d'une structure static lors de sa delcaration

13 réponses
Avatar
Arnaud Leconte
Bonjour,

Je developpe en proC qui est un langage oracle permettant d'ajouter des
appels SQL directement dans le code C.

Le principe est un pro Compilateur lit le code et le transforme en C.

J'ai besoin d'initialiser une structure static mais je ne connais pas sa
definition.


Le code generé peut être
int fct()
{
static Struct {
int len;
char arr[10];
} var;
}
ou

int fct()
{
static Struct {
char arr[10];
int len;
} var;
}


Das mon cas j'ai besoin d'avoir len initialisé à 0 et arr en chaine vide.
Actuellement j'utilise un short static qui m'indique si j'ai ou pas
initialisé ma structure.

Merci,
Arnaud.

10 réponses

1 2
Avatar
Horst Kraemer
On Sat, 1 May 2004 19:07:39 +0200, "Arnaud Leconte"
wrote:

Bonjour,

Je developpe en proC qui est un langage oracle permettant d'ajouter des
appels SQL directement dans le code C.

Le principe est un pro Compilateur lit le code et le transforme en C.

J'ai besoin d'initialiser une structure static mais je ne connais pas sa
definition.


Le code generé peut être
int fct()
{
static Struct {
int len;
char arr[10];
} var;
}
ou

int fct()
{
static Struct {
char arr[10];
int len;
} var;
}


Das mon cas j'ai besoin d'avoir len initialisé à 0 et arr en chaine vide.


Les structures seront initialisées automatiquement avec des valeurs
nulles parce qu'elles sont définies 'static'.

--
Horst

Avatar
Arnaud Leconte
"Horst Kraemer" wrote in message
news:
On Sat, 1 May 2004 19:07:39 +0200, "Arnaud Leconte"
wrote:

Bonjour,

Je developpe en proC qui est un langage oracle permettant d'ajouter
des


appels SQL directement dans le code C.

Le principe est un pro Compilateur lit le code et le transforme en
C.



J'ai besoin d'initialiser une structure static mais je ne connais
pas sa


definition.


Le code generé peut être
int fct()
{
static Struct {
int len;
char arr[10];
} var;
}
ou

int fct()
{
static Struct {
char arr[10];
int len;
} var;
}


Das mon cas j'ai besoin d'avoir len initialisé à 0 et arr en chaine
vide.



Les structures seront initialisées automatiquement avec des valeurs
nulles parce qu'elles sont définies 'static'.

--
Horst

Merci, c'est pourquoi un strcmp(var.arr, "chaine") marche sur mon server de

dev je suppose. '' = 0 non ?
Mais sur certains servers je pars en core dump.
Est ce du au caractere de fin de chaine ? Est ce qu'en testant plustot le
.len ca peut changer quelque chose ? Ou est ce simplement le compilateur qui
ne respecte pas la norme et n'initialise pas les variables ?
Je ne peux pas effectuer le test moi meme puisque sur mon server ca marche,
et je n'ai pas accé a 1 server qui part en coredump.

Arnaud.


Avatar
Horst Kraemer
On Sun, 2 May 2004 04:26:35 +0200, "Arnaud Leconte"
wrote:


"Horst Kraemer" wrote in message
news:
On Sat, 1 May 2004 19:07:39 +0200, "Arnaud Leconte"
wrote:

Bonjour,

Je developpe en proC qui est un langage oracle permettant d'ajouter
des


appels SQL directement dans le code C.

Le principe est un pro Compilateur lit le code et le transforme en
C.



J'ai besoin d'initialiser une structure static mais je ne connais
pas sa


definition.


Le code generé peut être
int fct()
{
static Struct {
int len;
char arr[10];
} var;
}
ou

int fct()
{
static Struct {
char arr[10];
int len;
} var;
}


Das mon cas j'ai besoin d'avoir len initialisé à 0 et arr en chaine
vide.



Les structures seront initialisées automatiquement avec des valeurs
nulles parce qu'elles sont définies 'static'.

--
Horst

Merci, c'est pourquoi un strcmp(var.arr, "chaine") marche sur mon server de

dev je suppose. '' = 0 non ?


Oui.

Mais sur certains servers je pars en core dump.
Est ce du au caractere de fin de chaine ?


Peut-etre. La raison la plus probable est que le tableau arr n'est pas
initialisé et contient des valeurs aléatoires qui ne contiennent pas
de 0. Au moment où le code de strcmp veut calculer la longueur de la
chaine dans arr (admettons que ce strcmp fait ce calcul), il dépasse
peut-être la zone de mémoire "légale". strcmp ne "sait" pas qu'il
s'agit d'un tableau de dix chars seulement parce que strcmp ne recoit
qu'un pointeur anonyme.

Est ce qu'en testant plustot le
.len ca peut changer quelque chose ?


Ca pourrait changer le comportement pour un compilateur non conforme
mais ca ne résout pas le problème . Ca ne crachera plus un core mais
si len n'est pas intialisé alors len contient de l'ordure aléatoire et
une comparaison de 0 avec de l'ordure a peu de sens ;-)

Ou est ce simplement le compilateur qui
ne respecte pas la norme et n'initialise pas les variables ?


Probablement. La norme dit qu'au moment ou la fonction main démarre,
tous les objets "static" du programme doivent être initialisés. Et
sans initialisation explicite l'initialisation par défaut est "zéro".


Tu pourrais essayer

int fct()
{
static Struct {
char arr[10];
int len;
} var = {0};
}

C'est une initialisation "à zéro" explicite qui initialise tous les
éléments de la structure. De par la norme c'est équivalent à ta
version sans initialisation explicite mais dans ton cas il faut vivre
avec des compilateurs "in the wild".


--
Horst



Avatar
Arnaud Leconte
"Horst Kraemer" wrote in message
news:
On Sun, 2 May 2004 04:26:35 +0200, "Arnaud Leconte"
wrote:


"Horst Kraemer" wrote in message
news:
On Sat, 1 May 2004 19:07:39 +0200, "Arnaud Leconte"
wrote:

Bonjour,

Je developpe en proC qui est un langage oracle permettant
d'ajouter




des
appels SQL directement dans le code C.

Le principe est un pro Compilateur lit le code et le transforme
en




C.

J'ai besoin d'initialiser une structure static mais je ne
connais




pas sa
definition.


Le code generé peut être
int fct()
{
static Struct {
int len;
char arr[10];
} var;
}
ou

int fct()
{
static Struct {
char arr[10];
int len;
} var;
}


Das mon cas j'ai besoin d'avoir len initialisé à 0 et arr en chaine
vide.



Les structures seront initialisées automatiquement avec des valeurs
nulles parce qu'elles sont définies 'static'.

--
Horst

Merci, c'est pourquoi un strcmp(var.arr, "chaine") marche sur mon server

de


dev je suppose. '' = 0 non ?


Oui.

Mais sur certains servers je pars en core dump.
Est ce du au caractere de fin de chaine ?


Peut-etre. La raison la plus probable est que le tableau arr n'est pas
initialisé et contient des valeurs aléatoires qui ne contiennent pas
de 0. Au moment où le code de strcmp veut calculer la longueur de la
chaine dans arr (admettons que ce strcmp fait ce calcul), il dépasse
peut-être la zone de mémoire "légale". strcmp ne "sait" pas qu'il
s'agit d'un tableau de dix chars seulement parce que strcmp ne recoit
qu'un pointeur anonyme.

Est ce qu'en testant plustot le
.len ca peut changer quelque chose ?


Ca pourrait changer le comportement pour un compilateur non conforme
mais ca ne résout pas le problème . Ca ne crachera plus un core mais
si len n'est pas intialisé alors len contient de l'ordure aléatoire et
une comparaison de 0 avec de l'ordure a peu de sens ;-)

Ou est ce simplement le compilateur qui
ne respecte pas la norme et n'initialise pas les variables ?


Probablement. La norme dit qu'au moment ou la fonction main démarre,
tous les objets "static" du programme doivent être initialisés. Et
sans initialisation explicite l'initialisation par défaut est "zéro".


Tu pourrais essayer

int fct()
{
static Struct {
char arr[10];
int len;
} var = {0};
}

C'est une initialisation "à zéro" explicite qui initialise tous les
éléments de la structure. De par la norme c'est équivalent à ta
version sans initialisation explicite mais dans ton cas il faut vivre
avec des compilateurs "in the wild".


--
Horst



Merci Horst.
Je n'ai jamais entendu parler des initialisations a zero avant. D'ou ca
vient c'est explicite dans la norme ? ou tu profites de la possibilité
d'initisaliser une structre ou un tableau par un groupe de valeur entre {}
mais dans ce cas, qu'est ce qui authorise d'initialiser un nombre de
parametres different de celui de la structure, et comment savoir lequel est
initialisé et comment sont geré les problemes de cast ?

Arnaud.




Avatar
Horst Kraemer
On Sun, 2 May 2004 18:04:19 +0200, "Arnaud Leconte"
wrote:

Je n'ai jamais entendu parler des initialisations a zero avant. D'ou ca
vient c'est explicite dans la norme ?


Oui.


ou tu profites de la possibilité
d'initisaliser une structre ou un tableau par un groupe de valeur entre {}
mais dans ce cas, qu'est ce qui authorise d'initialiser un nombre de
parametres different de celui de la structure, et comment savoir lequel est
initialisé et comment sont geré les problemes de cast ?


En principe ={0} n'initialise que le premier élément de la structure.
Mais selon la norme toute initialisation partielle entraine une
initialisation "à zéro" de tout le reste.

Il n'y pas de problèmes de cast. L'initinitialion "à zéro" initialise
tous les pointeurs à des pointeurs nuls, tous les flottants à 0.0, et
tous les entiers et les chars à "tous les bits 0".

--
Horst

Avatar
Arnaud Leconte
"Horst Kraemer" wrote in message
news:
On Sun, 2 May 2004 18:04:19 +0200, "Arnaud Leconte"
wrote:

Je n'ai jamais entendu parler des initialisations a zero avant. D'ou
ca


vient c'est explicite dans la norme ?


Oui.


ou tu profites de la possibilité
d'initisaliser une structre ou un tableau par un groupe de valeur entre
{}


mais dans ce cas, qu'est ce qui authorise d'initialiser un nombre de
parametres different de celui de la structure, et comment savoir lequel
est


initialisé et comment sont geré les problemes de cast ?


En principe ={0} n'initialise que le premier élément de la structure.
Mais selon la norme toute initialisation partielle entraine une
initialisation "à zéro" de tout le reste.

Il n'y pas de problèmes de cast. L'initinitialion "à zéro" initialise
tous les pointeurs à des pointeurs nuls, tous les flottants à 0.0, et
tous les entiers et les chars à "tous les bits 0".

--
Horst

J'ai plus qu'a verifier que le compilateur n'en fait pas qu'a sa tete pour

une fois.


Merci,
Arnaud.


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Arnaud Leconte" wrote:

Je n'ai jamais entendu parler des initialisations a zero avant. D'ou ca
vient c'est explicite dans la norme ?


Oui avec les variables 'static' et celle définies hors d'une fonction.

ou tu profites de la possibilité
d'initisaliser une structre ou un tableau par un groupe de valeur entre {}
mais dans ce cas, qu'est ce qui authorise d'initialiser un nombre de
parametres different de celui de la structure, et comment savoir lequel est


On a pas le droit de mettre un nombre d'initialiseurs supérieur au nombre de
champ (constraint violation). Si il est inférieur les autres champs sont
forcés à 0.

initialisé et comment sont geré les problemes de cast ?


On ne peut pas mettre n'importe quelle valeur. Elle doit être compatible avec
le type du champ. On peut techniquement mettre un cast, mais ça ne fait en
général que masquer un problème sans le corriger, et ça ajoute de la
confusion.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Arnaud Leconte" wrote:

J'ai plus qu'a verifier que le compilateur n'en fait pas qu'a sa tete pour
une fois.


Il faut en effet être prudent. J'ai eu le cas d'un compilateur pour DSP Texas
TMS302C64 pourtant réputé 'conforme ISO-C90', qui n'initialisait pas
implicitement les variables 'static'. Même avec une init explicite, c'était
douteux...

Dans ce cas, un memset() peut aider. Ca rend le code non portable, mais au
moins ça fonctionne.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Yves ROMAN

In 'fr.comp.lang.c', "Arnaud Leconte" wrote:

J'ai plus qu'a verifier que le compilateur n'en fait pas qu'a sa tete pour
une fois.


Il faut en effet être prudent. J'ai eu le cas d'un compilateur pour DSP Texas
TMS302C64 pourtant réputé 'conforme ISO-C90', qui n'initialisait pas
implicitement les variables 'static'. Même avec une init explicite, c'était
douteux...



Je me souviens de problèmes (avec VC me semble-t-il) où ces variables n'étaient
initialisées qu'avec une compilation en mode DEBUG, mais pas en mode RELEASE


Avatar
Antoine Leca
En , Horst Kraemer va escriure:
Il n'y pas de problèmes de cast. L'initinitialion "à zéro" initialise
tous les pointeurs à des pointeurs nuls, tous les flottants à 0.0, et
tous les entiers et les chars à "tous les bits 0".


Ce en quoi elle diffère de calloc(), qui ne donne la même garantie que pour
les entiers (et chars).


Antoine

1 2