Forum: Compiler & IDEs Was macht "x = y * +z" (C-Progr.)


von MarcusW (Gast)


Lesenswert?

Hallo an alle

Eher eine allgemeine C-Frage:

Ich bin derzeit dabei, mir einen Codeschnipsel anzusehen. Dabei bin ich 
auf eine Zuweisung gestossen, die ich überhaupt nicht interpretieren 
kann:

Wert_X = Wert_Y * +Wert_Z

Was macht diese Zuweisung? Konkret geht es um die Bedeutung des "+". Ich 
habe erst vermutet, dass dies eine Funktion zur Absolutwertbildung vom 
Wert_Z ist. Dafür würde ich dann jedoch wohl "abs()" nehmen.
Da ich absolut keinen Anhaltspunkt habe, ist es natürlich auch schwer, 
bei google was zu finden. Auch in meinen einschlägigen Büchern habe ich 
nichts gefunden.

Dank euch für eure Hilfe.

von Jaecko (Gast)


Lesenswert?

Hm... wären es zwei ++ würds heissen, dass x = y * z gerechnet wird, 
zuvor jedoch z um eins erhöht wird. Aber so... bleibt nur die schätzung, 
dass das + überflüssig ist bzw. ignoriert wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jaecko wrote:

> Aber so... bleibt nur die schätzung,
> dass das + überflüssig ist bzw. ignoriert wird.

Ja, es ist gewissermaßen ein positives Vorzeichen.  Das dürfte
lediglich aus Symmetriegründen zu:
1
Wert_X = Wert_Y * -Wert_Z;

syntaktisch zulässig sein.

von ... (Gast)


Lesenswert?

Werfe einen C-Compiler deiner Wahl an und schaue was bei rauskommt:
1
  int Wert_X = 0, Wert_Y = 2, Wert_Z = 0;
2
  
3
  for ( Wert_Z=0; Wert_Z<=10; Wert_Z++ ){
4
    Wert_X = Wert_Y * +Wert_Z;
5
  
6
    printf("Wert_X = %5d Wert_Y = %5d Wert_Z = %5d\n",Wert_X,Wert_Y,Wert_Z);
7
  }

von MarcusW (Gast)


Lesenswert?

So...

Hatte nun die Möglichkeit, das oben beschriebene kurze C-Programm auf 
einem Rechner auszuführen.

Es ist tatsächlich so, dass das "+" einfach weggelassen werden kann. Es 
hat keinerlei Einfluss.
Die Berechnung ist ein Teil eines Kalman-Filter-Programms. Als wär es 
nicht schon schwer genug, überhaupt mal ansatzweise die Theorie des 
Filters zu verstehen. Nein ... da mus dem geneigten Leser das Leben auch 
noch mit einem solchen, nicht nachvollziehbaren Code unnötig erschwert 
werden...

Danke für eure Hilfe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vielleicht ist es ja auch ein Bug im originalen Code?

von tex (Gast)


Lesenswert?

Was passiert in C, wenn

Was wird (+Wert_Z) wenn Wert_Z  negativ ist?

Was wird (Wert_Z) wenn Wert_Z  negativ ist?

Wenn ich mich ganz stark irre hat man diese Form in Pascal benutzt, um 
eventuell negativ werdende Werte von WertZ ins positive zu wandeln.

von MarcusW (Gast)


Lesenswert?

Hallo ihr

Ich hab das obige kurze C-Programm nochmals mit unterschiedlichen 
Parametern laufen lassen (Wert_Z mal negativ, mal positiv usw.). 
Ergebnis immer so, als wenn das "+" nicht vorhanden wäre.

Im nächsten Schritt habe ich mir gedacht, dass das "+" u.U. durch den 
gcc auf meinem PC wegoptimiert wird. Hab daraus hin das Programm einmal 
mit -o0, einmal mit -o5 und einmal mit -os kompiliert. Auch die drei 
unterschiedlichen Optimierungsstufen brachten keine Änderung.

@ tex
Mit der Wandlung ins positive sprichst du die auch von mir vermutete 
Absolutwertbildung an.

@ Jörg
Bug in der Quelle ist natürlich nicht auszuschließen. Wie gesagt, diese 
Zeile kommt aus der Kalman-Filterberechnung. Genauer aus dem 
Mikrokopter-Board. Der Kopter des Urhebers des Codes fliegt jedenfalls 
;-) Leider ist der Beitrag zu alt, so dass keiner mir mehr auf die Frage 
antworten kann.

Ich werde jetzt folgendes tun:
Ich hatte sowieso vor, den Kalman-Filter in Labview nachzubilden. Hat 
den Vorteil für mich, dass ich meine realen Messwerte von ACC- und 
Gyro-Sensor einlesen kann und graphisch anzeigen lassen kann. Zusätzlich 
kann ich da schön mit Einstellparametern spielen etc. etc. Die Zeilen 
mit der fraglichen Berechnung werde ich als C-Code mit im Labview 
einbinden. So werd ich dann wohl beurteilen können, ob das "+" einen 
Einfluss hat oder nicht.
Verspreche euch, das Ergebnis hier mitzuteilen.

Danke soweit

Ganz schön viel Arbeit für so eine einfache Berechnung :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

MarcusW wrote:

> Genauer aus dem
> Mikrokopter-Board. Der Kopter des Urhebers des Codes fliegt jedenfalls
> ;-)

Ist halt die Frage, ob das Ding eben immer noch fliegt, wenn man ein
+ mit einem ++ verwechselt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch wrote:

> Ist halt die Frage, ob das Ding eben immer noch fliegt, wenn man ein
> + mit einem ++ verwechselt.

Ist doch gestern in Mittelmeer gestürzt.

von Sven P. (Gast)


Lesenswert?

tex wrote:
> Was wird (+Wert_Z) wenn Wert_Z  negativ ist?
Wert_Z.

> Was wird (Wert_Z) wenn Wert_Z  negativ ist?
Wert_Z.
1
#include <stdio.h>
2
3
int main() {
4
  int i;
5
6
  for (i = -5; i <= 5; i++) {
7
    printf("(-i) = %3i, (i) = %3i\n", (+i), (i));
8
  }
9
}
ergibt
1
(-i) =  -5, (i) =  -5
2
(-i) =  -4, (i) =  -4
3
(-i) =  -3, (i) =  -3
4
(-i) =  -2, (i) =  -2
5
(-i) =  -1, (i) =  -1
6
(-i) =   0, (i) =   0
7
(-i) =   1, (i) =   1
8
(-i) =   2, (i) =   2
9
(-i) =   3, (i) =   3
10
(-i) =   4, (i) =   4
11
(-i) =   5, (i) =   5

> Wenn ich mich ganz stark irre hat man diese Form in Pascal benutzt, um
> eventuell negativ werdende Werte von WertZ ins positive zu wandeln.
Nö. Lässt sich auch da quasi als "(+1) *" umschreiben. Wird dort sogar 
explizit als "Unärer Operator für Identität" festgelegt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.