Hallo Leute,
Ich suche ein Makro, das mit die Anzahl der Parameter angibt.
Der folgende Code funktioniert nicht, das assert springt manchmal an,
obwohl alles ok ist.
Grüße Chris
char* PString::append(const char* str, … )
{
// TODO assert that occurencies of % match number of parameters
// TODO assert that type of parameters are valid (no PString but char*)
const int bufferSize = 1024;
char charBuffer[bufferSize];
va_list vlist;
va_start(vlist, str);
#ifdef DEBUG
int count_in_args = 0;
va_list args;
void* option = (void*)str;
va_start(args, str);
do
{
++count_in_args;
option = va_arg(args, void*);
}
while (option != 0 && option != " ");
va_end(args);
assert( count_in_string == count_in_args );
#endif
_vsnprintf( charBuffer, bufferSize-1, str, vlist );
cat( charBuffer );
return s;
}
Aufruf etwa mit PString().append("%f", 5.0f) oder („a%sc“, „b“)
Hallo Leute,
Ich suche ein Makro, das mit die Anzahl der Parameter angibt.
Der folgende Code funktioniert nicht, das assert springt
manchmal an,
obwohl alles ok ist.
Grüße Chris
Die Anzahl der Argumente findest du erstmal gar nicht raus,
weil die Info nirgends abgelegt wird. Um die Anzahl aber dennoch
(mehr oder weniger zuverlässig) rauszufinden, gibts es verschiedene
Möglichkeiten:
1. Du parsed den format string von deinem printf, der ist
ausschlaggebend, wieviele Argument tatsächlich erwartet werden.
(deswegen crashed printf() auch gerne mal, wenn der format string
mehr Variablen enthält als Funktionsargumente vorhanden sind).
Diese Methode sagt also nichts über die wirkliche Anzahl der
Argument aus, sondern nur über die Anzahl der 'verwendeten'
Argumente.
2. Üblicherweise übergibt man aber die Anzahl der Argument explizit
oder implizit.
Explizit als eigenes Argument, der die Anzahl enthält:
void function(unsigned numArgs, ...);
Usage: function(0);
function(1, "etwas");
function(2, "etwas", "mehr");
Implizit mit einem besonderen Abschlussargument:
void function(const char\* fmt, ...);
Usage: function("some format string", "etwas", "text", NULL);
Hallo,
Verflixt. Das ist blöd. Leider brauche ich diese Funktion um z.B. bei einem Assert die aktuelle Programmzeile als String auszugeben. Und die kann das Programm vorher nicht wissen, sie kann ein %-Zeichen enthalten und dann crasht es.
Gruß Chris
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]