Forum: Mikrocontroller und Digitale Elektronik Doku für Warning / Error messages?


von Phreak (Gast)


Lesenswert?

Servus!

Wo wenn nicht in avr-libc finde ich die Bedeutung von Compiler warnings 
oder errors heraus? Bin ich nur zu sehschwach oder sind die auf der 
avr-libc homepage nirgends aufgeführt?

Würde mich freuen, wenn mir jemand sagt, wo ich finde was ich suche.

Vielen Dank


Jürgen tha Phreak

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


Lesenswert?

Es dürfte keine komplette Zusamenfassung dafür irgendwo geben.
Normalerweise sind die Meldungen recht gut selbsterklärend (zumindest
die englischen :-).  Wenn du mit der Interpretation irgendeiner
Meldung ein Problem hast, dann frage konkret (sinnvollerweise auch
mit dem zugehörigen Quellcode-Schnipsel) hier im GCC-Forum.

von Phreak (Gast)


Lesenswert?

Aktuell beschäftigt mich folgendes:

    if((Delay == CYCLES) && (BlockFunc == FALSE))
    {
...
...
...
    }


Wobei CYCLES wie folgt:

#define TIMEDLY      0,1             // [Delay Time] = ms
#define MAINCLK      4000000         // [Main Clock] = 1/s

#define CYCLES       ((MAINCLK * TIMEDLY) >> 10)


Liefert:

warning: left-hand operand of comma expression has no effect

Comma expression? Wenn TIMEDLY eine Ganze Zahl ist, funktioniert es.

Hm.

LG


Phreak

von schmied (Gast)


Lesenswert?

Ersetz mal:
#define TIMEDLY      0,1

durch:
#define TIMEDLY      0.1

dann dürfte es gehen.

Schmied

von Karl H. (kbuchegg)


Lesenswert?

Phreak wrote:
> Wobei CYCLES wie folgt:
>
> #define TIMEDLY      0,1             // [Delay Time] = ms
> #define MAINCLK      4000000         // [Main Clock] = 1/s
>
> #define CYCLES       ((MAINCLK * TIMEDLY) >> 10)
>
>
> Liefert:
>
> warning: left-hand operand of comma expression has no effect

Preisfrage: Wo kommt da jetzt ein Komma vor?

>
> Comma expression? Wenn TIMEDLY eine Ganze Zahl ist, funktioniert es.

Klar Fliesskommazahlen schreiben sich ja auch mit einem Punkt :-)

Übrigens TIMEDLY ist in deinem Beispiel eine ganze Zahl :-)
Und wenn du das Komma durch einen Punkt austauscht, dann wird dir deine 
'clevere Division durch 1024' gehörig auf die Schnauze fallen.
Eine Fliesskommazahl kann man nicht durch 10 maliges nach rechts 
schieben durch 1024 dividieren!

Überlass solche Trickserein dem Optimizer des Compilers. Schreib den 
Code so, dass er für dich lesbar ist und das ausdrückt, was du 
beabsichtigst. Du beabsichtigst eine Division, also schreib auch eine 
Division.

#define CYCLES       ((MAINCLK * TIMEDLY) / 1024)

Wenn es möglich ist, diese Division durch Rechtsschieben zu ersetzen, 
dann macht das der Compiler für dich. Wenn nicht, dann lässt es der 
Compiler bleiben. Es gibt absolut keinen Grund, warum du selbst solche 
vermeintlichen Low-Level Optimierungen von Hand machen musst oder 
sollst.
Im schlimmsten Fall, so wie hier, trickst du dich damit nur selber aus.
Im besten Fall hast du eine Optimierung erzielt, die der Compiler auch 
ohne dich hinkriegen würde.

von Phreak (Gast)


Lesenswert?

>warning: left-hand operand of comma expression has no effect

>Preisfrage: Wo kommt da jetzt ein Komma vor?

Hä? Äh, äh ....Ägypten?!

>Übrigens TIMEDLY ist in deinem Beispiel eine ganze Zahl :-)

Nochmal: Hä? wieso jetzt. ... 0,1 Ganze Zahl?

Verstehe ich (noch) nicht.

Trotzdem danke für die anderen Tipps an alle!

Eines noch: Woher weiß ich denn wie gut mein Compiler compiliert. Was 
bewirken welche Optimierungsstufen. Dafür schaue ich mal in der avr-libc 
nach. Vielleicht habe ich dabei ja mehr Erfolg, wenn schon keine 
"warnings oder errors" dokumentiert sind.

LG

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


Lesenswert?

Phreak wrote:

> Nochmal: Hä? wieso jetzt. ... 0,1 Ganze Zahl?

Du solltest das C-Buch deiner Wahl nach der Bedeutung des Komma-
Operators befragen.

> ... wenn schon keine "warnings oder errors" dokumentiert sind.

Sie sind selbstdokumentierend.  Der Zustand würde sich für dich
kaum bessern, wenn du dazu noch drei Sätze mehr irgendwo findest,
da du ja einfach mal nicht die gleiche Sprache sprichst wie der
Compiler -- damit meine ich nicht das Englisch, sondern C.  Die
deutsche Übersetzung:

Die linke Seite des Komma-Operators bewirkt nichts.

würde dir ja in diesem Zusammenhang auch nicht helfen.

von Stefan (Gast)


Lesenswert?

Dein Komma kommt in "0,1" vor ;-)

Das Abtrennen von Nachkommastellen wird im Deutschen vereinbarungsgemäß 
mit einem "," gemacht. In vielen anderen Sprachen, und auch in allen 
Programmiersprachen die ich kenne, wird der "." als Dezimaltrenner 
benutzt. Wenn Du also in C schreibst "0.1" heißt das "Null komma eins". 
Wie sonst sollte das übergeben von mehreren Parametern an eine Funktion 
möglich sein:
1
float multipliziere(a float, b float);
2
3
x = multipliziere(1.5 , 2.5); //Einskommafünf mit zweikommafünf multiplizieren
4
5
x = multipliziere(1,5, 2,5); //So ein schmarrn, wie soll das der Compiler verstehen ?

von Sven P. (Gast)


Lesenswert?

Phreak wrote:
>>warning: left-hand operand of comma expression has no effect
>
>>Preisfrage: Wo kommt da jetzt ein Komma vor?
1
#define TIMEDLY      0,1             // [Delay Time] = ms
Da, hinter der Null.

>>Übrigens TIMEDLY ist in deinem Beispiel eine ganze Zahl :-)
>
> Nochmal: Hä? wieso jetzt. ... 0,1 Ganze Zahl?
>
> Verstehe ich (noch) nicht.

Weil '0,1' gleich 1 ist. Beispiel:
1
int a = (0,5) * 10;
a ist danach 50. '(0,5)' sind zwei Teilausdrücke, einmal 0 und einmal 5 
und das Ergebnis des Verbundes ist das Ergebnis des letzten 
Teilausdrucks. Der erste, 0, wird nirgends gebraucht, also verworfen 
(und GCC schmeißt dir ne Warnung zurück, weil 'er' vermutet, dass du 
dich da vertan hast). Das Ergebnis des zweiten Teilausdrucks ist 5, und 
damit auch gleich das Ergebnis des Verbundes. Also wird mit 5 
weitergerechnet.

von Karl H. (kbuchegg)


Lesenswert?

Phreak wrote:
>>warning: left-hand operand of comma expression has no effect
>
>>Preisfrage: Wo kommt da jetzt ein Komma vor?
>
> Hä? Äh, äh ....Ägypten?!

Kann ich grad noch gelten lassen

>
>>Übrigens TIMEDLY ist in deinem Beispiel eine ganze Zahl :-)
>
> Nochmal: Hä? wieso jetzt. ... 0,1 Ganze Zahl?

Weil es sich um einen Komma-Ausdruck handelt.
Ein Komma-Ausdruck besteht aus mehreren unabhängigen Ausdrücken, die
nacheinander ausgewertet werden.
Der Wert des kompletten Komma-Ausdrucks ist der rechteste (blöder 
Ausdruck) der Einzelausdrücke.

Ja. in C ist sowas legal.

   i =  sin(x) , cos(x);

sin(x) wird ausgewertet, cos(x) wird ausgewertet. Der Wert des 
Komma-Ausdrucks "sin(x), cos(x)" ist der rechteste, also cos(x).
i wird also cos(x) zugewiesen. Das sin(x) dazwischen war also nur 
Fleissaufgabe.

Kommaausdrücke sind selten. Am häufigsten sieht man sie noch in 
for-Schleifen

   for( i = 0, k = 0; i < irgendwas; ++i, ++k )

Für die Initialisierug wird ein Kommaausdruck benutzt (denn da ist ja 
nur ein einzelner Ausdruck erlaubt und ein Komma-Ausdruck ist ein 
einzelner Ausdruck, auch wenn er mehrere Aktionen anstösst) und bei 
jedem Schleifendurchlauf werden sowohl i als auch k um 1 erhöht.

>
> Verstehe ich (noch) nicht.

Ist jetzt hoffentlich klarer.

   i = 0,1;

ist legal. 0 ist ein Ausdruck. 1 ist ein Ausdruck. Beide sind zu einem 
Kommaausdruck zusammengefasst. Der Wert von i wird aber trotzdem nur 1 
sein, weil 1 der am weitesten rechts stehende Teilausdruck im 
Komma-Ausdruck ist.

> Eines noch: Woher weiß ich denn wie gut mein Compiler compiliert. Was
> bewirken welche Optimierungsstufen.

Die meisten Compiler haben Unmengen von Optimierungssschaltern, die 
meistens zu 2, 3, 4 Optimierungsgruppen zusammengefasst werden. Als 
Programmierer nimmt man dann einfach eine dieser 'Gruppen' als 
Optimierungsstufe.

Welche Optimierung genau gemacht wird, müsste irgendwo in der Doku 
stehen. Aber im Zweifelsfall gelten immer die Regeln:

* Mach dein Programm zuerst richtig,
  und erst dann mach es schnell.

  Besser ein Programm, welches richtig rechnet und einen Tick
  langsamer ist, als ein sauschnelles Programm, das falsche
  Ergebnisse auswirft.

* Bevor du zu optimieren anfängst, mach dich darüber
  schlau, wo überhaupt Optimierungsbedarf gegeben ist.

  10% vom Code sind für 90% der Laufzeit verantwortlich. Wenn
  du optimieren wilst, musst du diese 10% identifizieren. Alles
  andere ist vergeudete Entwicklungs-Zeit. Du kannst eine Funktion
  um den Faktor 100 beschleunigen, wenn diese Funktion aber gar nicht
  aufgerufen wird, hat die Optimierung keinen Einfluss auf die
  Gesamtlaufzeit.

* Vergiss fast alle 'cleveren' Low-Level Hacks.
  Die kennt dein Compiler alle und wendet sie riguros an.
  Besser noch: Dein Compiler weiss auch, wann sie nicht funktionieren

* Premature optimization is the root of all evil
  (Vorzeitige Optimierung ist die Wurzel allen Übels)

> nach. Vielleicht habe ich dabei ja mehr Erfolg, wenn schon keine
> "warnings oder errors" dokumentiert sind.

2 Problemkreise

* entweder ist die Fehlermeldung selbsterklärend, dann brauchst du auch 
keine Doku dazu

* oder die Fehlermeldung ist in Bezug auf die fragliche Codestelle so 
kryptisch und nichtssagend, dann hilft dir auch eine Doku nicht weiter.


Mit guten C-Kenntnissen kann man praktisch immer rausfinden, was eine 
Fehlermeldung bedeuten soll, und sei sie noch so kryptisch und 
nichtssagend. Die entsprechenden Buzzwords sind in den Fehlermeldungen 
praktisch immer enthalten (es sei denn, es handelt sich um deutsche 
Fehlermeldungen. igitt). Bei dir wäre das Buzzword 'Comma-Expression' 
gewesen. Aber dazu müsste man halt wissen, was eine Comma-Expression ist 
:-)

von Phreak (Gast)


Lesenswert?

Mensch,

ihr seid gut drauf hier! Vielen Dank; war ein netter kleiner Exkurs.

Eigentlich bin ich kein Freund von Foren, da ich bisher immer schlechte 
Erfahrungen gemacht. Wenn ich aber die Qualität und den 
Informationsgehalt in Bezug auf die Beantwortung meiner Fragen mit dem 
Niveau anderer Foren vergleiche (z. B. Fotografie oder so etwas), könnte 
ich beinahe ein Freund von Foren werden.

LG

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.