Forum: Mikrocontroller und Digitale Elektronik Gültigkeit von Variablen


von Ramses (Gast)


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)

von Klaus (Gast)


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.

von Mark M. (mom-jovi)


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.

von Daniel -. (root)


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 :)

von Stefan B. (stefan) Benutzerseite


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

von Daniel -. (root)


Lesenswert?

@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?

von Daniel -. (root)


Lesenswert?

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
Noch kein Account? Hier anmelden.