GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 55 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 11
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Benoit Izac
Le #22386431
Bonjour,

le 23/07/2010 à 10:12, Rémi BERTHOLET a écrit dans le message

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 ?



C99 seulement : MaFonction((struct MaStructure) {0,0});

--
Benoit Izac
Marc Boyer
Le #22386421
Le 23-07-2010, Rémi BERTHOLET
Mais je voudrais faire quelque chose comme cela :
MaFonction({0,0});

Existe t'il une syntaxe en C pour le faire ?



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
Antoine Leca
Le #22387041
Marc Boyer écrivit :
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.



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
espie
Le #22387031
In article Antoine Leca
Marc Boyer écrivit :
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.



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).



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
Samuel DEVULDER
Le #22388651
Rémi BERTHOLET a écrit :
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 ?



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.
Publicité
Suivre les réponses
Poster une réponse
Anonyme