Hi Ich habe ein Problem mit einem Programm in C18. In verschiedenen Funktionen wird die Variable i benutzt, besonders in for schleifen. Angenommen innerhalb solch einer Schleife wird in eine andere Funktion gesprungen wo wiederum eine Schleife mit i stattfindet, können sich die Variablen untereinander beeinflussen? Ich bin bisher davon ausgegangen, dass wenn man Variablen vor den Funktionen definiert, gelten sie imm gesamten Programm; wenn man sie innerhalb der Funktion definiert, nur innerhalb der Funktion... (i wird in jeder Funktion neu definiert)
zunächst mal: jedes deklarierte (korrekter: jedes Definierte i) i ist eine eigenständige Variable. Die beeinflussen sich gegenseitig nicht und bezeichnen also jeweils eine andere Speicheradresse. Nun kann es aber sein, dass sich mehrere Variablen mit gleichem Namen überdecken. Das ist z. B. der Fall wenn es eine globale Variable (also außerhalb einer Funktion deklariert) mit Namen i gibt und eine innerhalb einer Funktion deklarierte lokale Variable i gibt. Es ist nicht der Fall, wenn eine Funktion, in der ein i deklariert wurde eine andere aufruft, welche ebenfalls ein i deklariert. Denn die lokalen Variablen der aufrufenden Funktion sind für die aufgerufene nicht sichtbar. Was passiert nun, wenn 2 sichtbare Variablen den gleichen Namen haben? Dann wird beim Zugriff auf i immer auch die "nächste" Variable zugegriffen. Also im vorher genannten Beispiel würde auf das lokale i zugegriffen werden, da dies das globale i überdeckt.
Zu diesem Thema habe ich auch eine Frage. Ich habe in mein Programm nun die an anderer Stelle angesprochene FAT-Lib eingebunden. Diese nutzt File-Handler vom Typ signed char. Das Programm hat folgende Struktur:
1 | //globale Variablen
|
2 | |
3 | void main() |
4 | {
|
5 | init(); |
6 | signed char dataHandle; |
7 | dataHandle = fat_openWrite("data.txt"); |
8 | while(dataHandle<0) //Fehler beim Öffnen |
9 | {
|
10 | fat_close(dataHandle); |
11 | dataHandle=fat_openWrite("data.txt"); |
12 | }
|
13 | //weitere Anweisungen
|
14 | }
|
In dieser Form bringt der Compiler den Fehler, dass er dataHandle in der while-Schleife nicht kennt. Erst, wenn ich die Definition von dataHandle zu den globalen Variablen setze, läuft es.
was ist C18? ich nehme an, die Programmiersprache ist C++? dann handelt es sich bei i-Variablen um verschiedne Variablen. du kannst auch sowas problemlos machen int i = 10; void foo() { for(int i=0;i<20;i++){} for(int i=0;i<::i;i++){} // i nicht mehr bekannt hier int i; i=100; { int i=200; } // i ist 100 } g++ hat da einschaltbare Warnungen falls es nicht erwünscht ist -Wshadow wenn ich mich nicht täusche in C ist das etwas anders, da alle variablendefinitionen vor erster Anweisung stehen müssen. Da gibt es aber den Blocktrick { int i; for(i=...) } das ist nützlich, wenn per Makro ein Code hinzugefügt wird, der zu einem Namenclash führen könnte. es gibt aber auch dynamischen lookup .. wie in Perl aber das erspare ich lieber :)
Ratespiel, weil ein Copy&Paste der exakten Fehlermeldung fehlt. Du kompilierst anscheinend nicht im C99 oder GNU99 Dialekt (https://secure.wikimedia.org/wikipedia/en/wiki/C99). "# intermingled declarations and code, variable declaration no longer restricted to file scope or the start of a compound statement (block)" Das kannst du je nach Compiler mit einem Compilerswitch z.B. bei GCC mit -std=c99 oder -std=gnu99 ändern. Oder du änderst die Source
1 | void main() |
2 | {
|
3 | signed char dataHandle; |
4 | init(); |
@Mark ich sehe keinen Fehler in welcher Zeile meldet Compiler den Fehler? was ist das für ein Compiler? und ist der Rückgabewert der open Funktion in einem signed char abbildbar?
Stefan B. schrieb: > Du kompilierst anscheinend nicht im C99 oder GNU99 Dialekt > (https://secure.wikimedia.org/wikipedia/en/wiki/C99). das wird es wohl sein diese Probleme kommen dabei heraus, wenn man C89,C99 und C++ nicht trennt.
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.