Variable Argumenten

MedRamBO

Mitglied
Ich hab das Problem das eine überladene Funktion bei mir nicht funktioniert.
Der Code sieht folgendermaßen aus:

Code:
	void drawText(FONTSTYLE fontStyle, int x, int y, int r, int g, int b, int a, const char *text, ...) {
		D3DCOLOR fontColor = D3DCOLOR_ARGB(a, r, g, b);
		drawText(fontStyle, x, y, fontColor, text); 
	}

//this works fine.. 
	void drawText(FONTSTYLE fontStyle, int x, int y, D3DCOLOR fontColor, const char *text, ...) {
		RECT rct;
		rct.left = x; 
		rct.top = y; 
		rct.right = rct.left + 300; 
		rct.bottom = rct.top + 200;
		va_list va_alist;
		char logbuf[80] = {0};
		va_start(va_alist, text);
		_vsnprintf(logbuf + strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);
		va_end(va_alist);
		getFontByConst(fontStyle)->DrawText(NULL, logbuf, -1, &rct, 0, fontColor);
	}

Wenn ich die obere funktion aufrufe klappt es nicht. Da die variablen parameter (representiert mit ...) nicht übergeben werden nehme ich an

Wenn ich die untere funktion direkt aufrufe ist alles super.
 
Hi,

Ich hab das Problem das eine überladene Funktion bei mir nicht funktioniert.

...

Wenn ich die obere funktion aufrufe klappt es nicht. Da die variablen parameter (representiert mit ...) nicht übergeben werden nehme ich an#.

Was funktioniert nicht, was für Fehlermeldungen gibt es oder wie stellst du fest, dass es nicht funktioniert?

Gruß
RudolfG
 
Hi,



Was funktioniert nicht, was für Fehlermeldungen gibt es oder wie stellst du fest, dass es nicht funktioniert?

Gruß
RudolfG

Der code crasht die ganze applikation. Keine Fehlermeldung zu sehen.
Ich denke mal der compiler weiß nicht wie er damit umgehen muss wenn eine Funktion eine variable argumentenliste enthält und diese dann an eine andere funktion weiter gegeben werden muss.

Wenn ich den drawText aufruf in drawText ersetzte mit dem eigentlichen code, dann funktionert es.

So:
Code:
    void drawText(FONTSTYLE fontStyle, int x, int y, int r, int g, int b, int a, const char *text, ...) {
        D3DCOLOR fontColor = D3DCOLOR_ARGB(a, r, g, b);
        RECT rct;
        rct.left = x; 
        rct.top = y; 
        rct.right = rct.left + 300; 
        rct.bottom = rct.top + 200;
        va_list va_alist;
        char logbuf[80] = {0};
        va_start(va_alist, text);
        _vsnprintf(logbuf + strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);
        va_end(va_alist);
        getFontByConst(fontStyle)->DrawText(NULL, logbuf, -1, &rct, 0, fontColor);
    }
 
//this works fine.. 
    void drawText(FONTSTYLE fontStyle, int x, int y, D3DCOLOR fontColor, const char *text, ...) {
        RECT rct;
        rct.left = x; 
        rct.top = y; 
        rct.right = rct.left + 300; 
        rct.bottom = rct.top + 200;
        va_list va_alist;
        char logbuf[80] = {0};
        va_start(va_alist, text);
        _vsnprintf(logbuf + strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);
        va_end(va_alist);
        getFontByConst(fontStyle)->DrawText(NULL, logbuf, -1, &rct, 0, fontColor);
    }

Aber ich wollte ja eigenltich ein paar Zeilen einsparen, indem ich einfach die überladene drawText methode aufrufe. So hab ich den code quasi doppelt drin.
 
Ich denke mal der compiler weiß nicht wie er damit umgehen muss wenn eine Funktion eine variable argumentenliste enthält und diese dann an eine andere funktion weiter gegeben werden muss.
Ich glaube eher, dass du nicht weißt, wie du damit umgehen musst ;) Du rufst in der ersten Überladung von drawText nämlich die zweite Überladung ohne die variablen Argumente auf. Da müsstest du genau wie beim Aufruf von _vsnprintf mit va_start und va_end arbeiten.

Grüße,
Matthias
 
Zurück