www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gültigkeit von Variablen


Autor: Ramses (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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:
//globale Variablen

void main()
{
   init();
   signed char dataHandle;
   dataHandle = fat_openWrite("data.txt");  
   while(dataHandle<0) //Fehler beim Öffnen
   {
      fat_close(dataHandle);
      dataHandle=fat_openWrite("data.txt");
   } 
   //weitere Anweisungen
}

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.

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
void main()
{
   signed char dataHandle;
   init();

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.