PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Noob-Stress mit C: "Operation auf "counter" könnte undefiniert sein"


san.salvador
2008-10-16, 14:39:29
Hoi!

Ich sitz gerade über meiner C-Aufgabe und hab ein Problem. Das Programm an sich tut was es soll (alles andere als elegant :usad:), aber wenn ich mit -Wall kompiliere, meint gcc "Warnung: Operation auf "counter" könnte undefiniert sein".

Wenn ich mir die Zeilennummern so ansehe, könnte es sich um counter = counter++; handeln.
Ich bin mir aber keines Fehlers bewusst. Am Anfang habe ich counter brav mit int counter = 0; initialisiert.
Was kann ich vermurkst haben? Wenn die Bude nicht fehlerfrei mit -Wall kompiliert, hab ich nix davon. ;(

The_Invisible
2008-10-16, 14:48:44
der operator ++ verhält sich wie "counter = counter + 1", alles klar?

mfg

urpils
2008-10-16, 14:49:37
meine bescheidenen kenntnisse sagen:
counter++ heißt soviel wie counter + 1.. und das möchtest du, oder?
ist dann counter = counter++ nicht doppelt gemoppelt?

san.salvador
2008-10-16, 14:51:42
Ich Eumel. :ugly:

Ihr habt natürlich beide recht, mir ist vor lauter lustigen Zeichen schon ganz schwurbelig. :D

Coda
2008-10-16, 14:52:02
Wobei counter++ den ursprünglichen Wert zurückgibt, und ++counter den nach dem Inkrement. Das sollte man auch beachten.

Eigentlich will man fast überall Präfix-++ verwenden. Auch - und vor allem - in Schleifen.

san.salvador
2008-10-16, 15:01:40
Habs grad nochmal mit ++counter; statt counter++; probiert - macht in meinem Programm aber keinen Unterschied. Ein Glück. :D

DocEW
2008-10-16, 15:06:38
Wobei ich die GCC-Fehlermeldung trotzdem nicht verstehe... was ist denn an
int counter = 0;
counter = counter++;

falsch?

Trap
2008-10-16, 15:11:17
Es ist nicht definiert, ob counter danach 0 oder 1 sein soll.

san.salvador
2008-10-16, 15:13:35
Es ist nicht definiert, ob counter danach 0 oder 1 sein soll.
Dass mag stimmen, wenn man in C denken kann. Aber ich als Noob denke mir: Wozu erhöhe ich den counter, nur damit er nachher wieder 0 ist?

Trap
2008-10-16, 15:22:44
Im C-Standard steht:
"the value of a scalar object may be modified no more than once between any two consecutive sequence points."

= ändert den Wert und ++ ändert den Wert, sequence points sind in dem Beispiel die ;, damit ist der Code undefiniert.

Der C-Compiler wird sicher keine Überlegungen zu Intention des Autors anstellen ;)

Gast
2008-10-16, 15:50:25
Wobei ich die GCC-Fehlermeldung trotzdem nicht verstehe... was ist denn an
int counter = 0;
counter = counter++;

falsch?er war keine Fehlermeldung, sondern eine Warnmeldung (-Wall)

DocEW
2008-10-16, 17:14:08
Im C-Standard steht:
"the value of a scalar object may be modified no more than once between any two consecutive sequence points."

= ändert den Wert und ++ ändert den Wert, sequence points sind in dem Beispiel die ;, damit ist der Code undefiniert.
Interessant, wusste ich gar nicht.
Dann ist i = i = i + 1 auch nicht erlaubt? Oder rafft er, dass in der linken Zuweisung keine Änderung stattfindet?

san.salvador
2008-10-16, 17:16:54
Nachdem das Problem gelöst ist, nutze ich den Fred noch für eine weitere Frage:
Ist Emacs für Linux der Editor der Wahl, und wenn ja, wie funktioniert das Ding? :D
Ich hab ihn mal installiert und angeworfen, aber ich kann damit nichts anfangen. Ich habs noch nichtmal geschafft, eine haumichblau.c zu erstellen.
Derzeit bau ich den Code mit Ultraedit unter Win, der Editor gefällt mir sehr gut. Den Rest mach ich aber unter Linux in einer VM.
Wenn ich mir die Daten Hin - und Herschubserei sparen könnte, wär das eine feine Sache.
Alles was ich dafür brauche, ist ein anständiger Editur für Linux.

Trap
2008-10-16, 17:35:17
Emacs ist doch selbsterklärend. Soll heißen: Man kann die Onlinehilfe starten und etwa 100 Stunden später weiß man ungefähr wie es funktioniert :tongue:

robobimbo
2008-10-16, 17:42:55
Also ich programmier unter Linux ganz gerne mit Geany, ganz brauchbarer Editor und hat Build und Run auf Click parat, auch halbwegs brauchbares Autocomplete :)

Coda
2008-10-16, 18:32:35
Interessant, wusste ich gar nicht.
Dann ist i = i = i + 1 auch nicht erlaubt? Oder rafft er, dass in der linken Zuweisung keine Änderung stattfindet?
Doch das ist ja wohldefiniert.

The_Invisible
2008-10-16, 18:51:06
Nachdem das Problem gelöst ist, nutze ich den Fred noch für eine weitere Frage:
Ist Emacs für Linux der Editor der Wahl, und wenn ja, wie funktioniert das Ding? :D
Ich hab ihn mal installiert und angeworfen, aber ich kann damit nichts anfangen. Ich habs noch nichtmal geschafft, eine haumichblau.c zu erstellen.
Derzeit bau ich den Code mit Ultraedit unter Win, der Editor gefällt mir sehr gut. Den Rest mach ich aber unter Linux in einer VM.
Wenn ich mir die Daten Hin - und Herschubserei sparen könnte, wär das eine feine Sache.
Alles was ich dafür brauche, ist ein anständiger Editur für Linux.

naja, kommt draufan welchen komfort du willst bzw brauchst.

ich komme mit eclipse + cdt ganz gut klar, obwohl es für kleine projekte wohl overkill ist und manche eclipse generell hassen :D

mfg

DocEW
2008-10-17, 12:17:00
Doch das ist ja wohldefiniert.
Hmm... aber "the value of a scalar object may be modified no more than once between any two consecutive sequence points.", und es finden ja zwei Zuweisungen statt.

Gast
2008-10-17, 13:47:50
Nachdem das Problem gelöst ist, nutze ich den Fred noch für eine weitere Frage:
Ist Emacs für Linux der Editor der Wahl, und wenn ja, wie funktioniert das Ding? :Dich persönlich habe Emacs noch nie viel abgewinnen können, und nutze unter Linux, wenn keine IDE wie Eclipse, KDevelop o.ä. zur Verfügung steht, lieber KWrite. Auf der Arbeit muss ich mich aber leider mit Sun Solaris 8 rumschlagen, da kann ich noch froh sein, wenn ich Emacs zur Verfügung habe, ansonsten darf ich mich mit vi begnügen.