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
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.
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.
>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
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.
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
floatmultipliziere(afloat,bfloat);
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 ?
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
inta=(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.
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
:-)
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