Gültigkeit von Variablen

Gast #1398395
Lesenswert?

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)
Gast #1398399
Lesenswert?

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.
#2025379
Lesenswert?

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.
#2025412
Lesenswert?

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 :)
Persönliche Seite #2025413
Lesenswert?

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();

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren