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.
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
Ersetz mal: #define TIMEDLY 0,1 durch: #define TIMEDLY 0.1 dann dürfte es gehen. Schmied
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 | 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 ? |
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.