write to va_arg standard-konform?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

write to va_arg standard-konform?

Beitrag von kaiserludi »

Folgender Code funzt in VS ohne Probleme:

Code: Alles auswählen

va_arg(argptr, int) = 1000;
Clang hingegen meint: "Expression is not assignable".
GCC meint: "lvalue required as left operand of assignment".

Hier steht nichts davon, ob die Expression nun ein l-value sein muss oder kann oder nicht sein darf:
http://www.cplusplus.com/reference/clib ... rg/va_arg/

Wer ist denn jetzt hier standard-konform?

PS:
Mit dieser Implementierung ist va_arg ein lvalue und der Schreibzugriff funzt ordnungsgemäß wie unter VS:

Code: Alles auswählen

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )
#define va_copy(dest, src) ((void)((dest) = (src)))
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: write to va_arg standard-konform?

Beitrag von BeRsErKeR »

Nur mal aus Interesse. Was willst du mit diesem Code anfangen? Soweit ich das verstehe setzt du den Wert eines Funktionsparameters vom Typ int. Was soll das bringen?

Ich hatte vor kurzem mal festgestellt dass sich der gcc und der VS Compiler bei Funktionsparametern anders verhält, jedenfalls für non-const Referenzen, die man direkt im Funktionsaufruf instanziiert. Der gcc meckert, der VS Compiler frisst es.
Ohne Input kein Output.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

Ist ein vereinfachtes Beispiel.
Im Konkreten Anwendungsfall habe ich eine Library vorliegen, welche fleißig SNWPRINTF nutzt, was unter VS als vsnprintf defineirt ist und unter GCC als vsprintf (GCC vsprintf verhält sich praktisch wie VS vsnprintf, während das VS vsprintf einen Parameter weniger will). Nun muss die Lib aber auch auf einer Plattform laufen, welche nichts entsprechendes implemnetiert hat. Dazu hat es bisher gereicht, einfach den Formatstring zu UTF8 zu konvertieren und dann an vsnprintf weiter zu reichen. Dummerweise viel jetzt aber auf, dass vsnprintf auf der Palttform auch kein %ls oder %S versteht, ja scheinbar überhaupt keine wchar_t* Parameter frisst.
Mein Workaround ist, über die die va_list zu gehen und alle Parameter, die der Formatstring als wchar_t identifiziert, ebenfalls in UTF8 zu konvertieren. Anschließend überschreibe ich den entsprechenden optionalen Parameter, wo bisher der der wchar_t* stand, mit dem generierten char* und amche mir dabei zu nutze, dass Datenpointer die gleiche Größe haben und Strings in C ja bekanntlich nur ein Poitner auf den ersten Character sind. Das ganze funktioniert utner VS perfekt, wenn man davon absieht, dass ein Funktionsaufruf dieser Implementation im ersten noch völlig unoptimierten Wurf ca. 100 mal so teuer ist wie der der MS Implementation von vsnprintf.
Leider kompiliert die Zeile, in der ich schreibend auf die va_list zugreife, im GCC nicht und die betreffende Plattform nutzt GCC als Compiler (aber eben nicht die von gcc mitgelieferte C-Standardlib).
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

Hmm, anscheinend ist die einzige Möglichkeit, die Parameter einzeln an mehrere snprintf()-Aufrufe zu übergeben:
http://stackoverflow.com/questions/4535 ... ist-on-gcc
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

OK, damit hätte ich nicht gerechnet:
die neue Version mit sprintf-Aufrufen für jeden Parameter und für jedes Stück Formatstring zwischen 2 Parametern kostet nur 75% der Zeit, die die alte Version mit nur einem sprintf-Aufruf benötigt hat :shock:
Naja, mir solls recht sein.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

Es funzt 8-)
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: write to va_arg standard-konform?

Beitrag von BeRsErKeR »

Ansonsten halt einfach eine Kopie des Funktionsparameters nutzen. Macht man ja prinzipiell eh wenn man den weiterverarbeiten will. Die 4 Bytes sollten nicht weh tun.
Ohne Input kein Output.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

BeRsErKeR hat geschrieben:Ansonsten halt einfach eine Kopie des Funktionsparameters nutzen. Macht man ja prinzipiell eh wenn man den weiterverarbeiten will. Die 4 Bytes sollten nicht weh tun.
Wollte ich erst, ist aber daran gescheitert, dass mich der GCC grundsätzlich nicht schreibend auf eine va_list zugreifen lassen will, egal ob es sich um Original oder Kopie handelt, wie auch im Link oben bestätigt wird. Das ich also keine eigene Liste basteln kann, kann ich auch keine Liste an vsnprintf weiterleiten, es sei denn das unveränderte Original, auf dem ich maximal den Pointer aufs nächste Arg weitergeschoben habe, aber keine Kopie des Originals mit Veränderungen und auch keine neue Liste.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: write to va_arg standard-konform?

Beitrag von BeRsErKeR »

Ich dachte in deinem Fall gäbe es kein vsprintf und du würdest es daher von Hand nachbauen. Hab ich wohl missverstanden.
Ohne Input kein Output.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: write to va_arg standard-konform?

Beitrag von kaiserludi »

BeRsErKeR hat geschrieben:Ich dachte in deinem Fall gäbe es kein vsprintf und du würdest es daher von Hand nachbauen. Hab ich wohl missverstanden.
Nein, es gibt kein vswprintf (mit w) und kein snwprintf (mit w), deswegen habe ich das bisher über Konvertierung in utf8 und dann vsnprintf (ohne w) nachgebaut, musste dass aber, damit es auch für wchar_t* in der optionalen Argumentliste und nicht nur für en Formatstring selbst funzt, jetzt auf mehrere Calls zu snprintf (ohne w) umbauen, da dein einzelner Call zu vsnprintf (ohne w) durch den fehlende Möglichkeit, eine va_list on the fly zu verändern oder zu erstellen, nicht geeignet ist.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Antworten