CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

C++ fonction à nm d'arguments variable

jejej
jejej
Niveau 9
23 novembre 2006 à 00:11:29

Bonjour tout le monde ;)
voila , j´ai un ptit probleme avec cette fonction :
http://rafb.net/paste/results/XOMj4w77.html

elle ne m´affiche en effet que les entiers jusqu´au ´0´ ... c´est normal etant donné le
"while( (arg = va_arg(ap,int)) )" ,
0 voulant dire false ,
mais comment faire pour afficher cet entier , et les suivants ?

si vous avez une idée , ça m´aiderait :) ça fait pas longtemps que je me suis remis au C++ ...
merci beaucoup

kufa
kufa
Niveau 9
23 novembre 2006 à 04:00:14

Reponse simple: tu ne peux pas :)
En effet, va_arg n´est qu´une macro pour incrementer le bon pointeur (il peut y en avoir plusieurs differents (par type) selon la platforme) et retourne celui-ci. Il n´y a aucune gestion de fin de liste.
Un usage classique de va_arg serait de passer le nombre d´arguments en parametre (en general celui sur lequel tu fais va_start), ou utiliser une string de formattage comme pour vsnprintf.
Si tu ne veux pas directement entrer le nombre d´arguments, je pense que tu peux t´en sortir avec des tyeplist, mais c´est plus complexe.

Au passage, va_arg existe aussi en C ;)

kufa
kufa
Niveau 9
23 novembre 2006 à 04:00:52

EDIT: tu peux aussi utiliser une valeur de fermeture, comme ce que realise ton 0 pour l instant.

jejej
jejej
Niveau 9
23 novembre 2006 à 13:45:05

arf merci kufa :)
Ptete que je m´y suis pas pris de la bonne façon...
en fait , j´ai une classe Liste , et je voudrais avoir un constructeur qui prendrait un nombre inconnu d´arguments pour pouvoir créer une liste comme ceci :

Liste l( 2 ,3 ,4 ,5 ,6 ,0 ,19 ,20 ,0 ,1 ,2 );
qui me donnerait directement une liste contenant les elements si dessus , plutot que d´avoir a créer une liste contenant ´2´ , puis d´ajouter un par un les autres elements avec des l.Add(3) etc...
( en fait , comme en scheme )

dnob700
dnob700
Niveau 10
23 novembre 2006 à 22:03:01

typiquement, il y aura une constante dans ton programme pour préciser la fin de la liste:

Liste l (2,3,4,5,FinListe);

c´est ce qui est utilisé pour initialiser X si je me souviens bien. Je ne sais pas si les arguments que tu passe peuvent avoir un type variables (peut-être qu´en C++ avec les rtti c´est possible), sinon tu peut te faire une classe avec un opérateur de conversion implicite depuis les entiers et dont FinListe est une instance particulière (ça permet de ne pas utilisé un entier spécial pour la fin de la liste, mais bon, il y a peu de chance que l´utilisateur rentre -456876321 dans son programme...)

kufa
kufa
Niveau 9
24 novembre 2006 à 18:51:18

Si tu as pas peur d avoir un gros exe, tu peux tjs faire qqchose avec les templates:
http://rafb.net/paste/results/HrVVFn21.html

Fvirtman
Fvirtman
Niveau 10
24 novembre 2006 à 20:15:45

Mon dieu, j´ai l´esprit archi mal tourné ! :lol:

"Si tu as pas peur d avoir un gros exe"

C´est fou ce qu´on peut penser quand on lit ça vite !! :rire2:

Bon, ne me faites pas croire que vous etes tous des saints en me répondant que vous n´avez pas compris !

J´en ris encore :lol:

Fvirtman
Fvirtman
Niveau 10
24 novembre 2006 à 20:22:15

Sinon, plus sérieusement, tres sympa comme méthode :)

Inconvénient, tu ne peux mettre que des constantes définies a la compilation avec ça.
Mais bon, c´est le seul moyen d´éviter de faire un caractere terminal, ou alors un "int n" en premier argument qui définit le nombre de données qui suivent.
J´ai fait un petit tuto sur les arguments variables :

http://perso.numericable.fr/~fvirtman/info/tuto/G_17_stdarg.cpp

kufa
kufa
Niveau 9
24 novembre 2006 à 21:00:49

Inconvénient, tu ne peux mettre que des constantes définies a la compilation avec ça.

Non, pas du tout:
http://rafb.net/paste/results/kUlCqb96.html

Sinon un petit commentaire sur ton tuto: utilise vnsprintf a la place de vsprintf, et utilise un static char[] si tu ne fais pas du code reentrant

Sinon oups, mon expression a homonyme etait totalement invonlontaire :)

jejej
jejej
Niveau 9
25 novembre 2006 à 05:14:22

:rire: vous inquietez pas j´ai deja un gros .exe :fou:

minimum 500 ko à chaque hello world :( doit y avoir des options à bidouiller là... m´enfin c´est pas le probleme... ( le probleme serait plutot qu´est que je fait sur l´ordi a 5 heure du mat´ :( ? ) enfin jvous remercie tous d´avoir repondu , ça fait plaisir de vous revoir :fou: ça fait longtemps... jvous pond un rpg d´ici 3 mois :D Jvais etudier le code à Kufa, pis la solution de faire un FinListe avec une valeur à la con...

Fvirtman
Fvirtman
Niveau 10
25 novembre 2006 à 10:00:10

jejej > un exe de 500 Ko : tu dois etre en "debug"

le mode "debug" est ideal pour debugguer, pour un avoir un code assez sécurisé (par exemple certaines variables s´initialisent a zero meme si tu ne l´as pas fait (mais gare ! ne pas faire confiance à ça !) ) et toutes les infos de debuggages sont stockées.
résultat :
- un code pour debugguer, donc super
- un gros exe
- un programme relativement lent.

Une fois que tu as un truc qui tourne, recompile le en release.
resultat :
- un code non débuggable dans ce mode
- un petit exe
- un programme tres rapide.

dnob700
dnob700
Niveau 10
25 novembre 2006 à 10:14:50

sachant que même en release VC++ génère quelques info de débogage qui grossissent le programme.

Il faut mettre "info de débogage" sur "aucun" (ça doit ressembler à ça) dans les options de compilation.Et il faut que tu lui dise d´utiliser le runtime dans des DLL release (les mots sont là, il suffit de les mettre dans le bon ordre), mais ça c´est l´option par défaut.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment