mikrocontroller.net

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


Autor: MarcusW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jaecko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
Wert_X = Wert_Y * -Wert_Z;

syntaktisch zulässig sein.

Autor: ... (Gast)
Datum:

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

Autor: MarcusW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist es ja auch ein Bug im originalen Code?

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MarcusW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <stdio.h>

int main() {
  int i;

  for (i = -5; i <= 5; i++) {
    printf("(-i) = %3i, (i) = %3i\n", (+i), (i));
  }
}
ergibt
(-i) =  -5, (i) =  -5
(-i) =  -4, (i) =  -4
(-i) =  -3, (i) =  -3
(-i) =  -2, (i) =  -2
(-i) =  -1, (i) =  -1
(-i) =   0, (i) =   0
(-i) =   1, (i) =   1
(-i) =   2, (i) =   2
(-i) =   3, (i) =   3
(-i) =   4, (i) =   4
(-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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.