Forum: Compiler & IDEs problem mit variablen definieren


von Christian J. (wernerle)


Angehängte Dateien:

Lesenswert?

Hallo ich hoffe diese Frage gehört in dieses Forum, weil ich noch neu 
hier bin und mich noch nicht so auskenne...

Ich habe ein Problem mit den Variablen. Immer wenn ich eine Variable im 
atmel studio deklariere funktioniert sie nie... .

Im Anhang ist einen kleines Testprogramm, dass nicht funktioniert und 
ich weiß nicht warum:
1)Wenn der Simulator läuft, werden die Variablen "ignoriert" und mit der 
Funktion ADD WATCH, der Variablen, steht "unknown location" -> also sie 
werden nirgens im ram abgelegt.
2)Wenn ich die Zeile "unsighnt char...." zwischen #include und 
Hauptprogramm schreibe, dann liegt x richtig im Ram und pcvar liegt im 
flash auf 0x0000?!?! (ich kann sie auch dann im Programm nicht 
ändern...)

Entweder ich versteh die Deklerationen der Variablen nicht und mache 
selber etwas falsch oder der Compiler macht blösin (weil z.B. mit dem 
C51-compiler in unserer Schule kann man die "speicherorte" selbst 
auswählen [ist das auch mit dem GCC-Compiler möglich?])

Ich wäre dankbar wenn mir jemend MEINEN "Gedankenfehler" ausbessert und 
vieleicht ein paar Tipps über die Speichertypen geben würde, weil mit 
den Datentypen finde ich mich soweit zurrecht.

Danke!

von Daniel V. (danvet)


Lesenswert?

Du solltest mit deinen Variabelen auch etwas "sinnvolles" machen, sondt 
werden sie einfach wegoptimiert.
Vielleicht hilft das:
1
while(1){
2
  x++;
3
  if(x > 10)
4
  {
5
    pcvar = 7;
6
    x = 0; 
7
  }
8
}

von radiostar (Gast)


Lesenswert?

Wie Daniel schon angedeutet hat, merkt der Compiler, daß Dein Programm 
nichts sinnvolles tut. Du weist den Variablen in der SChleife zwar Werte 
zu, aber sonst passiert nichts mit denen -> ergo ignoriert der Compiler 
diese Variablen und legt sie gar nicht erst an. Deshalb kann der 
Debugger sie nicht sehen.

Schau Dir mal die Optimierungseinstellugen Deines Compilers an, die kann 
man auch abschalten. (-O0)

von Karl H. (kbuchegg)


Lesenswert?

Hans Wernerle schrieb:

> Entweder ich versteh die Deklerationen der Variablen nicht und mache
> selber etwas falsch oder der Compiler macht blösin

Der Compiler macht keinen Blödsinn.
Aber er optimiert.
Zum Beispiel optimiert er alles weg, was keinen Effekt auf das Programm 
hat, ausser Laufzeit und/oder Speicher zu verbrauchen.

Eine Berechnung, deren Ergebnis für nichts benutzt wird, fliegt raus. 
Weil ja das Ergebnis dieser Berechnung keinen von aussen sichtbaren 
Effekt hat.
Eine lokale Variable, die in keiner Berechnung vorkommt, fliegt raus. 
Weil sie ja offensichtlich eh keiner braucht.

von Christian J. (wernerle)


Lesenswert?

also das x funktioniert schon, aber das pcvar noch nicht... -> also 
wirds an dem liegen, dass nichts sinvolles gemacht wird ;).

ich sag mal danke, aber kann man die variablen auch manuel definieren, 
ob sie z.B. im Register, Ram... liegen? Oder macht das alles der 
Compiler? Weil wenn ich z.B. das Programm zwischendurch testen will und 
NOCH nichts sinvolles mit den Variablen gemacht habe, könnte ich ja nie 
den Test durchführen...



... und das mit dem Optimierungsgrad werd ich mir mal ansehen, was 
wahrscheinlich dann meine frage über die manuelle definietion erübrigt.

von Karl H. (kbuchegg)


Lesenswert?

Hans Wernerle schrieb:

> ich sag mal danke, aber kann man die variablen auch manuel definieren,
> ob sie z.B. im Register, Ram... liegen? Oder macht das alles der
> Compiler?

Im Normalfall: ja, das macht der Compiler. Dazu hat man ihn ja, dass er 
sich um die schmutzigen Dinge kümmert.

> Weil wenn ich z.B. das Programm zwischendurch testen will und
> NOCH nichts sinvolles mit den Variablen gemacht habe, könnte ich ja nie
> den Test durchführen...

Na ja.
Was willst du denn da testen?
Ob der Compiler eine Variable anlegt?
Der legt sie schon an, wenn sie gebraucht wird.

Ich versteh schon, dass du noch Anfänger bist. Aber das was du momentan 
'testen' nennst, ist in Wirklichkeit kein testen. Du 'testest' ja auch 
nicht, ob der Compiler eine for-Schleife richtig umsetzt, sondern gehst 
davon aus, dass er das tut. Sonst wär das ja kein Compiler, wenn er bei 
solchen Kleinigkeiten aussteigen würde.
Schreib einigermassen sinnvolle Programme, zb. die üblichen ersten 
Programme, in denen ein Port auf Ausgang gesetzt wird; häng ein paar LED 
an die Ausgänge und erzeug Muster - zb in dem du ein x inkrementierst 
und an den Port ausgibst. Da hast du mehr davon, als mit solchen 
Primtiv-Tests, die im Grunde nichts aussagen.

von Christian J. (wernerle)


Lesenswert?

ich muss für meine diplomarbeit in der HTL eh kompliziertere Programme 
machen... aber ich bin nicht so vertraut mit dem Compiler und wollte 
deshalb so kleine Tests durführen, um ein wenig zu lernen was der 
Compiler da tut, bin nämlich vom Assambler gewohnt sich über jeden 
....-dreck sich gedanken zu machen ;)

sag aber trotzdem nochmal Danke und ein Lob für das Forum, weil man da 
sehr schnell die Antworten bekommt!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst das Programm mit  -save-temps -fverbose-asm erzeugen und dir 
das s-File (asm) durchlesen, wenn du magst auch das i-File (reines C 
ohne #).

http://www.rn-wissen.de/index.php/Assembler-Dump_erstellen_mit_avr-gcc

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.