Passage de structure en paramètre d'une fonction
Le
Rémi BERTHOLET
Bonjour,
J'ai un code qui ressemble à cela :
struct MaStructure
{
int x;
int y;
};
void MaFonction(struct MaStructure)
{
}
Je peux appeler ma fonction en faisant :
struct MaStructure data = {0,0};
MaFonction(data);
Mais je voudrais faire quelque chose comme cela :
MaFonction({0,0});
Existe t'il une syntaxe en C pour le faire ?
Merci
J'ai un code qui ressemble à cela :
struct MaStructure
{
int x;
int y;
};
void MaFonction(struct MaStructure)
{
}
Je peux appeler ma fonction en faisant :
struct MaStructure data = {0,0};
MaFonction(data);
Mais je voudrais faire quelque chose comme cela :
MaFonction({0,0});
Existe t'il une syntaxe en C pour le faire ?
Merci

Poser une question


le 23/07/2010 à 10:12, Rémi BERTHOLET a écrit dans le message
C99 seulement : MaFonction((struct MaStructure) {0,0});
--
Benoit Izac
C'est une extension C99, les "compound litteral".
struct s { int i ; int j ; } ;
void f( struct s );
void g( void ){
f( (struct s){ 0 , 1 } ) ;
f( (struct s){ .j= 0 , .i= 0 } );
}
Après, C99 n'avait pas forcément bonne presse (je ne
suis plus trop ça). En fait, certaines parties de la norme
C99 ne sont pas implantées par les compilateurs courants,
et je ne sais si cette fonctionnalité en fait partie.
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?a...amp;id_mot0
Celle fonctionnalité-là est plutôt bien accueillie.
Mais c'est une invention du comité (par d'existant auparavant), donc il
faut effectivement un compilo « récent » (= dont le développement s'est
poursuivi dans les 8 dernières années).
Antoine
C'est un des trucs dont je ne vois pas trop l'interet. Ca ne fait que
rajouter de la syntaxe pas tres utile a un langage qui est deja bloated.
Je ne suis pas non plus fan des initialiseurs a la con.... ca aurait bien
plus simple d'autoriser les operateurs d'affectation classiques un peu
partout, y compris pour fixer des valeurs initiales de variables en dehors
d'une fonction, plutot que d'inventer encore un bout de syntaxe bizarroide.
Et a cote, on n'a toujours pas les parametres anonymes comme en C++, et
on est oblige d'utiliser des extensions cretines genre attribute((unused))
pour faire taire le compilo... tssss
Vu que ta fonction ne retourne rien, je propose ceci:
#define MaFonctionAux1(init)
do {
struct MaStructure data = init;
MaFonction(data);
} while(0)
Après les macros, c'est pas toujours bien vu. De plus je ne vois pas
trop ce pourquois tu veux à tout prix passer des accolades. Tu pourrais
aussi bien avoir:
void MaFonctionAux2(int x, int y) {
struct MaStructure data = {x, y};
MaFonction(data);
}
Globalement il n'y a pas grande utilité à ces fonctions/macros
auxiliaires. Eventuellement passer par Aux1 (la macro) est de pouvoir
nommer les champs ".x=" et ".y=" et donc de ne pas se préoccuper de
savoir si x est le 1er ou le 2eme paramètre:
MaFonctionAux1({.y=1, .x=2});
Ca peut faciliter la relecture du code surtout si la fonction prend 5
entiers qu'ils vaut mieux distinguer. Mais encore là perso c'est rare
que je passe des constantes comme ca. Si une constante a un sémantique
précise, alors j'utilise plutôt une vars locale (const) ou un define qui
défini que 1 est la valeur d'init de y et 2 celle d'init de x:
#define INIT_X 2
#define INIT_Y 1
MaFonctionAux2(INIT_X, INIT_Y);
sam.