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

initialisation de structure

10 réponses
Avatar
batyann811
Bonjour,

J'ai un petit bout de programme C qui ne compile pas avec gcc et je ne
vois pas ou est le problème.

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

struct point { int x, y; };

const struct point p1 = { 0, 0 };

struct point p2 = p1; /* !!! : inititializer element is not constant */

int main(int argc, char** argv) {
return (EXIT_SUCCESS);
}

Pourquoi l''initializer element' n'est il pas constant ???

10 réponses

Avatar
batyann811
Après quelques recherches sur internet il semblerait que
l'initialisation ne soit possible qu'avec des 'constantes littérales'.
Un peu pénible mais bon...
Avatar
Vincent Lefevre
Dans l'article <49354ac0$0$874$,
batyann811 écrit:

Après quelques recherches sur internet il semblerait que
l'initialisation ne soit possible qu'avec des 'constantes littérales'.



Pas forcément. Toute expression constante convient. Mais une variable,
même "const", ne forme pas une expression constante.

Un peu pénible mais bon...



Oui, c'est dommage qu'on ne puisse pas créer de vraies constantes.
L'utilisation du préprocesseur reste un hack.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
espie
In article <49354ac0$0$874$,
batyann811 wrote:
Après quelques recherches sur internet il semblerait que
l'initialisation ne soit possible qu'avec des 'constantes littérales'.
Un peu pénible mais bon...



Oui, le C possede de nombreuses limitations de cet ordre. C'est quand meme
un langage de relativement bas niveau par rapport a d'autres.

Si tu trouves ca trop penible, tu es mur pour le C++ (et son cortege
d'autres soucis)... ;-)
Avatar
batyann811
Marc Espie wrote:

Si tu trouves ca trop penible, tu es mur pour le C++ (et son cortege
d'autres soucis)... ;-)


Pour me retrouver avec des trucs aussi lisibles que ça :

for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ ... }

Non merci ! ;-)
Avatar
espie
In article <49356079$0$868$,
batyann811 wrote:
Marc Espie wrote:

Si tu trouves ca trop penible, tu es mur pour le C++ (et son cortege
d'autres soucis)... ;-)


Pour me retrouver avec des trucs aussi lisibles que ça :

for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ ... }



En C++0x, ca devrait etre plus lisible, genre
for (auto it=m.begin() ; it != m.end(); ++it) {
}

Ceci dit, je ne trouve pas cet iterateur si incomprehensible que ca,
par rapport a d'autres soucis...

Et a cote de ca, c'est quand meme un beau troll: ce genre de choses ne
peut pas arriver en C, puisqu'aucun des concepts n'est supporte par le
langage, et donc qu'il faut tout faire a la main (et sans verification de
type, si on veut du polymorphisme; et avec de gros sales bouts de
preprocesseur si on veut vraiment faire comme en C++).
Avatar
Marc Boyer
On 2008-12-02, batyann811 wrote:
Marc Espie wrote:

Si tu trouves ca trop penible, tu es mur pour le C++ (et son cortege
d'autres soucis)... ;-)


Pour me retrouver avec des trucs aussi lisibles que ça :

for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ ... }

Non merci ! ;-)



Un parcours d'une table dont les clef sont des paire de
pointeurs et les éléments des ensembles de pointeurs, je ne
pense pas que ce soit super lisible en C pour rester en charte.

Marc Boyer
--
En France, un habitant sur 1000 est en prison.
Aux USA, 7 habitants sur 1000 sont en prison.
Est-ce que les USA sont 7 fois plus sûrs ?
Avatar
Marc Boyer
On 2008-12-02, batyann811 wrote:
Après quelques recherches sur internet il semblerait que
l'initialisation ne soit possible qu'avec des 'constantes littérales'.
Un peu pénible mais bon...



Et oui, const n'est pas une constante. Pour s'en souvenir,
l'écrivais à mes étudiants

const l = random();

l est bien const. De là à ce que ce soit une constante...

Marc Boyer
--
En France, un habitant sur 1000 est en prison.
Aux USA, 7 habitants sur 1000 sont en prison.
Est-ce que les USA sont 7 fois plus sûrs ?
Avatar
-ed-
On 2 déc, 15:08, batyann811 wrote:
J'ai un petit bout de programme C qui ne compile pas avec gcc et je ne
vois pas ou est le problème.



<...>

Pourquoi l''initializer element' n'est il pas constant ???



Ne pas confondre 'variable à lecture seule' et 'expression constante'.

struct point
{
int x, y;
};

#define INIT { 3, 4 }

struct point p1 = INIT;
struct point p2 = INIT;

int main (void)
{
return 9;
}
Avatar
Eric Levenez
Le 11/12/08 07:35, dans
,
« -ed- » a écrit :

int main (void)
{
return 9;
}



9 ? Tu es sûr ?

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
-ed-
On 11 déc, 07:57, Eric Levenez wrote:
Le 11/12/08 07:35, dans
,
« -ed- » a écrit :

> int main (void)
> {
>    return 9;
> }

9 ? Tu es sûr ?



Non ! Mon doigt a glissé. C'est 0, bien sûr...