Parameterproblem
-
Hallo,
folgendes Problem:
falsche Werte werden übergenen:
function( va_arg(args, int), va_arg(args, float) )
korrekte Werte werden übergenen:
int i_tmp = va_arg(args, int); float f_tmp = va_arg(args, float); function(i_tmp, f_tmp);
Woran kann das liegen?
Vielen Dank für Eure Tipps!
-
Das liegt daran, dass der Compiler die Argumente in einer anderen Reihenfolge auswerten kann als die tatsächlich auf dem Stack liegen. Viel mehr kann ich dir auch nicht sagen, weil ich auf diese Funktionsweise vor kurzem selber erst drauf aufmerksam gemacht worden bin, als ich ein ähnliches Problem hatte. Fakt ist jedoch, dass deine 2. Variante die richtige ist, da sonst zu 99 % nur Murks rauskommt.
Falls es dir hilft, poste ich das, was mir dazu gesagt wurde:
"<unwichtig> its pushing them onto the stack in reverse order"
"<unwichtig> the compiler can make it evaluate the arguments in a different order than they go onto the stack"
-
Aha, Danke!
Werden die Parameterwerte nun nur in verkehrter Reihenfolge oder in keiner vorhersebaren Reihenfolge abgearbeitet?
-
*Grml*
Ich habe hier duzende Funktionen mit duzenden Parametern.
Gibt es wirklich keinen einfachen Weg um eine vorhersebare Verarbeitungsreihenfolge der Parameter zu bewirken?
-
Was willst du denn machen?
Die Reihenfolge ist natuerlich durch die Aufrufkonvention definiert. Normalerweise sollte das aber egal sein, weil das ja eben der compiler macht.also erklaer mal lieber was du machen willst.
-
Die Parameterwerte sind in einem String gespeichert.
Wie oben gezeigt möchte ich die Parameterwerte mit dem Rückgabewerte von va_arg(...) gleich übergeben.
va_arg(...) geht dabei von einem Paramter im String zum nächsten.Also wenn er die Parameter nicht in der richtigen Reihfolge von Anfang an ausgewertet wird (über va_arg(...)), dann wird es natürlich mist.
Wenn dies nicht zu umgehen ist, ist die ausgesprochen Mist, da ich so für etliche Funktionen, duzende Paramter direkt zuweisen müsste.
-
Gurkä schrieb:
va_arg(...) geht dabei von einem Paramter im String zum nächsten.
dann duerfte es keine probleme geben.
du hast hoffentlich nicht eine andere aufrufkonvention angegeben?Wenn dies nicht zu umgehen ist, ist die ausgesprochen Mist, da ich so für etliche Funktionen, duzende Paramter direkt zuweisen müsste.
ganz ehrlich: das klingt nach einem designfehler was du vorhast.
-
Shade Of Mine schrieb:
ganz ehrlich: das klingt nach einem designfehler was du vorhast.
Dieser Satz muss einfach in meine Signatur :p
-
Nein, dies ist kein Designfehler.
Ich bekomme die Funktionsnamen und Parameter nun einmal nur in Strings geliefert und kann nicht direkt die Funktionen "abfangen".Ist es nun möglich die Verarbeitung der Argumente nach einer bestimmten Reihenfolge zu bewirken?
Danke!
-
Dein Problem ist, dass bei
function( va_arg(args, int), va_arg(args, float) )
die Reihenfolge der Auswertung nicht definiert ist. Das ist in diesem Fall:
int i_tmp = va_arg(args, int); float f_tmp = va_arg(args, float); function(i_tmp, f_tmp);
egal, weil i_tmp und f_tmp keine Seiteneffekte haben, va_arg aber schon.
args ist ja quasi ein Stack, va_arg popt da nur runter. Wenn nun va_arg(args, float) vor va_args(args, int) ausgewertet wird, kommt natürlich blödsinn raus.
Die Lösung hast du ja eh schon gepostet, nämlich va_arg nicht im Funktionsaufruf auszuwerten.
-
OK, danke.
Die Reihenfolge der Abarbeitung ist nicht und kann nicht festgelegt werden.
Das war es was ich wissen wollte.