Hallo, ich bin eher der Assemblerfuzzi und habe nun das Problem, dass ich ein C-Programm für einen PIC24F machen will. Compilermantel ist der MPLAB C30, welcher offenbar laut Compilermeldung den hier allseits bekannten gcc nutzt. Nun bin ich ein verdammter Nobody mit diesem Compiler und generell alles andere als ein C-Könner und weiß nicht, wie man eine Variable so definiert, dass deren Speicherplatz garantiert nicht irgendwo doppelt belegt ist. Dieses Gefühl beschleicht mich hier aber, da ich je nach Platzierung von Dummybytes in der globalen Varibalendeklaration teilweise ein komplettes Fehlverhalten habe und dies eigentlich nur durch ungewollt veränderte Variablenwerte auftreten kann. Ich definiere sowohl die globalen als auch die lokalen Variablen alle ganz primitiv mit z.B.: unsigned int variable_1; Jetzt gibt es ja noch die vielen Zustatzdeklarationen wie z.B. private, volatile, static usw. Welche davon muss ich nehmen, damit mir der C-Compiler garantiert keine Doppelbelegung verursacht? Oder kann es auch am Stackspeicher liegen, den der Compiler anscheinend selbst anlegt (ich wüsste nicht wie ich das selbst in C steuern kann) Ich weiss, das sind die voll dummen Fragen, aber deren Lösung für mich essentiell, sonst muss ich für immer und ewig in der Assemblerwelt bleiben! muchas grazias Senores e Senoritas im voraus!
Hilfloser Wurm am Rande des Universums schrieb: > Welche davon muss ich nehmen, damit mir der C-Compiler garantiert keine > Doppelbelegung verursacht? Was heißt denn Doppelbelegung? Erklär das mal bitte? Meist du der Compiler überschreibt einfach so Variablen die später im Programmablauf noch benötigt werden? Nein tut er nicht. Hilfloser Wurm am Rande des Universums schrieb: > muchas grazias Senores e Senoritas im voraus! Das heißt 'muchas gracias' by the way
Das ist das Problem mit Compilern, bevor man sie nutzen kann, muss man lernen wie sie funktionieren.Und weil sie sehr complex sind kann das eine Weile dauern.
muchas gracias Michael, >Was heißt denn Doppelbelegung? Erklär das mal bitte? Meist du der >Compiler überschreibt einfach so Variablen die später im Programmablauf >noch benötigt werden? Nein tut er nicht.Was heißt denn Doppelbelegung? >Erklär das mal bitte? Meist du der >Compiler überschreibt einfach so Variablen die später im Programmablauf >noch benötigt werden? Nein tut er nicht. Doch das glaube ich eben (d.h. ich weiss es nicht). Wenn ich z.B. global definiere: unsigned int variable_1; unsigned int variable_2; unsigned int variable_3; unsigned int intarry1[10]; unsigned int variable_4; unsigned int dummy1[50]; unsigned int variable_5; so funktioniert ein bestimmter Teil meiner Software einwandfrei, ein anderer jedoch nicht. Nehme ich z.B. dann das unbenutzte Variablenarray dummy1[50] raus: unsigned int variable_1; unsigned int variable_2; unsigned int variable_3; unsigned int intarry1[10]; unsigned int variable_4; unsigned int variable_5; so geht fast gar nichts mehr. Ich habe erst nach dem Auftreten komischer Phänomene mit eingefügten Dummybytes (welche ich nicht nutze!) experimentiert und damit komplett unterschiedliche Programmabläufe erhalten. Daher meine Frage, wie ich sicher gehen kann, dass ein Variable niemals vom Stack oder sonstwoher mitbenutzt wird. Alles static deklarieren??? Also Speicherplatz hätte ich genug und bin nicht auf Compileroptimierungen angewiesen!
>Das ist das Problem mit Compilern, bevor man sie nutzen kann, muss man >lernen wie sie funktionieren.Und weil sie sehr complex sind kann das >eine Weile dauern. Ja, scheint so. Aber offenbar hänge ich ja an etwas Grundlegendem.
Hilfloser Wurm am Rande des Universums schrieb: > Daher meine Frage, wie ich sicher gehen kann, dass ein Variable niemals > vom Stack oder sonstwoher mitbenutzt wird. Alles static deklarieren??? Solange Du eine Programmierumgebung verwendest, in der es Pointer gibt, kannst Du das nicht verhindern. Ein Pointer könnte irgendwo in die Wicken zeigen, oder wenn irgendwo ein char[] über sich selber und sein Ende hinauswächst, dann war es das. Wirklich sicher in dieser Hinsicht bist Du nur in Java oder C# oder so. Aber dieses Zeugs willst Du aus anderen Gründen nicht auf Deinem PIC24 haben. fchk
Hilfloser Wurm am Rande des Universums schrieb: >>Compiler überschreibt einfach so Variablen die später im Programmablauf >>noch benötigt werden? Nein tut er nicht. > > Doch das glaube ich eben (d.h. ich weiss es nicht) Der Compiler überschreibt es nicht. Aber du. Vielleicht schreibst du mit wirrem Index jenseits der 10 in intarry und landest deshalb irgendwo dahinter. Mit dummy-Array dort, ohne es an einer Stelle wo es mehr Schaden anrichtet. C Compiler mit Indexüberprüfung sind nicht direkt üblich. Wenn das unverzichtbar ist, weil du den Programmfehler anders nicht findest, dann musst du dir eine Programmiersprache suchen, die einen Array-Index überprüft.
>Der Compiler überschreibt es nicht. Aber du.
D.h. die einfachen Variablendeklarationen ohne Zusatz von static o.ä.
genügend vollkommen?
Diese Aussage möchte ich hören, das reicht mir vorerst.
Dann kann ich anderer Stelle weitersuchen. Evtl. auch die
Stackproblematik, da ich nicht weiß, wie der Compiler das händelt. Aber
das wird wohl irgendow im Handbuch des C-Compilers zu finden sein.
Hilfloser Wurm am Rande des Universums schrieb: > D.h. die einfachen Variablendeklarationen ohne Zusatz von static o.ä. > genügend vollkommen? Richtig erkannt...
Wenn das Programm einigermaßen übersichtlich ist, hilft vielleicht auch das Aktivieren des "disassembly window". Dort kann man sich durch den erzeugten Assemblercode (single)steppen und im "watch window" die Werte der Variablen und Register verfolgen.
Danke Dieter, das mache ich zukünftig. Ich habe jetzt (ziemlich planlos, da die Anleitungen zu lesen ja Tage und Wochen dauern) bei den Linker-Einstellungen rumgespielt und die Option "Don't initialize data sections" angeklickt. Und siehe da, ich kann jetzt machen was ich will, meine Software läuft in sämtlichen Varianten!!! So ein sch..., dass ich mich in der ganzen Linker- C- und sonstnoch Welt überhaupt nicht auskenne. Danke an alle. Der Fehler liegt also in den tieferen Weihen der Linkereinstellung in Verbindung mit meinem amateurhaften Programmaufbau begraben...
Hilfloser Wurm am Rande des Universums schrieb: > Danke Dieter, > > das mache ich zukünftig. > Ich habe jetzt (ziemlich planlos, da die Anleitungen zu lesen ja Tage > und Wochen dauern) bei den Linker-Einstellungen rumgespielt und die > Option > > "Don't initialize data sections" > > angeklickt. > Und siehe da, ich kann jetzt machen was ich will, meine Software läuft > in sämtlichen Varianten!!! > So ein sch..., dass ich mich in der ganzen Linker- C- und sonstnoch Welt > überhaupt nicht auskenne. Jein, "Don't initialize data sections" heißt nichts anderes als das sich der Compiler/Linker in diesem Fall nicht standardkonform verhält und globale Variablen nicht mehr initialisiert (d.h. auf Null setzt, wenn nichts anderes angegeben ist)
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.