[C]fonction avec nombre d'arguments variable

Bonjour!
Je souhaiterais créer une fonction, qui, selon les cas, pourrait ne pas prendre le même nombre d’arguments.
Pour mieux me faire comprendre, voici un exemple tout bête : cette fonction doit initialiser des structures, et au lieu de l’appeler à chaque fois pour chaque structure, je l’appelle 1 fois, en lui passant en argument les structures.
Mon souci, c’est que je ne sais pas comment faire ce genre de chose. Il me semble que le main fait un peu ceci avec le *argv[], mais je ne comprends pas tout.
Voilà, en espérant avoir été assez clair…
:006

Tu as la réponse en effet. Le truc est qu’au lieu de passer tes argument un à un tu accepte un tableau (*argv[]) d’arguments. Ensuite dans ton programme tu traite cette série d’argument comme un tableau classique :wink: . Voilà pour le principe après pour l’application je ne peut pas t’aider puisque ça fait plus de 5 ans que je n’ai pas retouché a du C/C++ :083

En plus c’est un truc qui interpelle tout le monde mais qu’on trouve rarement sur les bouquins.
Mais pour tout le reste heureusement qu’il y a internet et ses moteurs de recherche :
[]Listes d’arguments variables
[
]Les fonctions à nombre variable d’arguments

En Borland C (je ne sais pas si c’est ANSI) on utilisait la déclaration “…”

Comme en Java :mrgreen:

Je n’ai jamais vue de fonctions variadiques en ja va et c’est temps mieux parce que même en C c’est pas terrible a utiliser (l’exemple le plus connu est printf).

Le plus simple c’est le tebleau en effet. Comme la fonction main, celle-ci reçoit la taille du tableau (int argc) et un tableau de chaine de caractères. Si tu as juste une structure dont le type diffère alors il faut utiliser des pointeurs sur tes structures.

[quote=“MisterFreez”]Je n’ai jamais vue de fonctions variadiques en ja va et c’est temps mieux parce que même en C c’est pas terrible a utiliser (l’exemple le plus connu est printf).[/quote]Eh, les petites jeunes faut pas pousser, Le C est vieux pratiquement 40ans et peut être plus. Le C++ et le Java est venu bien longtemps après, c’est normal que ce soit plus pratique avec eux.

C’est une nouveauté Java 6. En fait il déclare une fonction avec un tableau en argument les “…” sont juste une facilitée d’écriture :wink:

@dmon : Heureusement qu’en 40 ans on a fait des progrès dans les langage :041

[quote=“MisterFreez”]Je n’ai jamais vue de fonctions variadiques en ja va et c’est temps mieux parce que même en C c’est pas terrible a utiliser (l’exemple le plus connu est printf).
[/quote]
Question de point de vue, j’avais réalisé en son temps des fonctions permettant la création de menu déroulant controlables à la souris dans une library sous ms-dos, et les appels à cette fonction se faisaient dans le style

menuPrincipal("&Fichier","Editio&n","&Affichage","&Historique");

Je trouve ça beaucoup plus élégant qu’un **char, et plus facile à maintenir.

Le problème d’une fonction variadique c’est que t’es obligé de foutre en l’aire tout typage. En java (>= 5) utiliser des object pour transtyper tout et n’importe quoi c’est pas recommandé. En C/C++ utiliser les void* faut vraiment le faire avec parcimonie quand tu n’a pas d’autre choix.

Après avoir des fonctions variadiques en perl, python, ruby ou autre ce n’est pas un souci le duck typing est là pour gérer le typage et c’est réellement prévu par le langage.

Après ce sont des choix faites comme vous le sentez :slight_smile:

NB : Pour l’astuce de l’elispe en Java (>= 6) je ne connaissait pas je ne sais pas ce que ça fait exactement, mais comme dis plus haut ça semble être un simple sucre syntaxique.

Merci à tous pour vos réponses et explications. Oui, le C, c’est pas le plus récent, mais ce n’est pas trop compliqué. Il faut que je continue avec le C++, mais na notion d’objet me fait un peu peur. Bref, en attendant, je vais lire les liens et tester :slight_smile:
:006

Ca n’a rien de bien sorcier … il ne faut pas en faire une montagne. :wink:

J’imagine bien, mais comme je commence à m’habituer au C, ça tout pleins de nouveaux mots :slight_smile: . Bon, j’ai jeté un tout petit oeil sur le site du zero hier soir, et c’est vrai que ça parait même plus simple en définitive. Le livre des éditions Eyrolles (“apprendre le C++”, C.Delannoy) est un peu moins attractif que le site du zero, mais faudra que je finisse de le lire quand même :slight_smile: .

Tiens, une petite question sans grande importance : les bibliothèques du C peuvent être réutilisées dans le C++ ?

Oui sans problème. Pour grossir le trait C++ n’est qu’une surcouche au C. Donc tout ce que tu apprend en C tu peut le réutiliser en C++ :023

Le C++ est un vrai langage ! C’est juste qu’il est compatible avec le C.

Le C++ est un vrai langage ! C’est juste qu’il est compatible avec le C.[/quote]
Il faut quand même admettre que la syntaxe ressemble beaucoup à celle du C, et que pas mal de choses sont inspirées du C. Ceci dit, il y a quand même beaucoup de différences. Mais pour apprendre C++, ça aide de connaitre le C .

Le C++ est un vrai langage ! C’est juste qu’il est compatible avec le C.[/quote]
Il faut quand même admettre que la syntaxe ressemble beaucoup à celle du C, et que pas mal de choses sont inspirées du C. Ceci dit, il y a quand même beaucoup de différences. Mais pour apprendre C++, ça aide de connaitre le C .[/quote]
Oui un compilateur C++ comprend toute la syntaxe du C, mais il faut bien comprendre que c’est deux langages différents avec des mécanismes propres (préprocesseurs, typage,…). Il est important de comprendre ces différences.

c’est pour ça que j’ai précisé “pour grossir le trait

Le site du zéro présente les différences entre le C et le C++ plus comme des améliorations. Ceci dit, je ne suis pas rendu au bout, mais c’est un bon plus aux autres cours qui sont souvent très magistraux.

Je ne suis jamais allé sur ce site. Mais ça prouve un grand manque de connaissance de la part des auteurs. Excusez moi d’insister mais ce sont deux langages qui évoluent de manière différentes et à des vitesses différentes. La dernière norme C, C99, ajoute dans la norme des choses qui ne sont actuellement pas gérer dans la norme C++ (mais c’est pris en compte dans C++ 1x).

Pour commencer dire “tu peut faire du C++ exactement de la même manière que du C” je suis d’accord mais il vaut mieux éviter d’énoncer des choses fausses même pour simplifier.

NB : A noter qu’historiquement le C++ a était conçu comme un “super-préprocesseur” pour le C mais on parle là du C++ de 1972.