fonction à nombre de paramètres variable

  • Créateur du sujet Créateur du sujet xcode
  • Date de début Date de début
A

Anonyme

Invité
J'ai fait une fonction à nombre de paramètres variable. voici le code :
Bloc de code:
#include <cstdarg>
[...]

template<typename T>
void rajoutTab (vector<T> &tab, size_t comb, ...) {
	va_list ap;
	va_start(ap, comb);
	for (size_t i = 0; i < comb; i++) {
		tab.push_back(va_arg(ap, T));
	}
	va_end(ap);
}

Je l'utilise ici :

Bloc de code:
Triangle::Triangle (Nombre un, Nombre deux, Nombre trois, bool rect) {
	vector<Nombre> tmpTab;
	rajoutTab(tmpTab, 3, un, deux, trois); [COLOR="Red"]//le warning est ici[/COLOR]
	[...]

Quand je compile (gcc), il me met trois warning :

Bloc de code:
/Users/fabrice/Desktop/Dropbox/Public/Site/Code/C++/iMath/iMath/ObjsCalcLigne.cpp:248: warning: cannot pass objects of non-POD type 'class Nombre' through '...'; call will abort at runtime
/Users/fabrice/Desktop/Dropbox/Public/Site/Code/C++/iMath/iMath/ObjsCalcLigne.cpp:248: warning: cannot pass objects of non-POD type 'class Nombre' through '...'; call will abort at runtime
/Users/fabrice/Desktop/Dropbox/Public/Site/Code/C++/iMath/iMath/ObjsCalcLigne.cpp:248: warning: cannot pass objects of non-POD type 'class Nombre' through '...'; call will abort at runtime

Et quand je lance le prog, il s'arrête juste à l'appel de la fonction (pas dedans) : "Illegal instruction"

Grrrr... :mad:

Help :zen:
 
:D:cool::p

http://en.wikipedia.org/wiki/Variadic_function tu vas aimer sisi c'est en english :p

Bloc de code:
// template<typename T> la qu'es-ce que tu lui dis hein

// void rajoutTab (vector<T> &tab, size_t comb, ...) et la tu lui dis stroumph!!!!! ... 
// demmerde toi!!!!!!, 8-) ... c'est un compileur/parseur pas un interpreteur de
// ton esprit torturé 8-D, alors le preprocessor te repond fuck you!!! je comprend pas 
// ce que tu me dis je ne l'ajoute pas ou le troncate en se basant sur la premier couleur 
// que tu as donné ce genre de comportement imprevisible et a la discretion du compileur
// que tu  utilises.
call will abort at runtime == Illegal instruction ;) :love::D

Bloc de code:
template<typename T, typename... Args> // [B]aka il faudrait annoncer la bonne couleur[/B]  :D
void printf(const char* s, const T& value, const Args&... args) { 
// const Args&... args [B]aka  il faudrait annoncer la bonne couleur [/B]
  while (*s) {
    if (*s == '%' && *++s != '%') {
      std::cout << value;
      return printf(++s, args...);
    }
    std::cout << *s++;
  }
  throw std::runtime_error("extra arguments provided to printf");
}
j'espere que tu as VC 2010 sur woinwoin :rateau: oui encore quelque chose de standard et trop difficile pour les devs de M$.

:zen:
 
Quand je compile ton code, il me fait ça :
Bloc de code:
[COLOR="Red"]error: expected nested-name-specifier before '...' token
expected '>' before '...' token
expected ',' or '...' before '&' token[/COLOR]
[COLOR="Yellow"]ISO C++ forbids declaration of 'Args' with no type[/COLOR]
:(
 
In the upcoming standard of C++, C++0x, templates may also take variadic argument lists; this feature is called variadic templates

tu ne peux pas si tu avais lu ou alors tu as besoin d'une version de gcc avec le support variadic template,
mais ta declaration en reste fausse meme avec le support variadic.

utilises une template [map type -> value] args ou une fonction C ou macro comme boost
ou tout bonnement evite et considere que cela n'existe pas, trouve un autre design.