Deadlock in Übersetzungsdurchgang

OP #4160081
Lesenswert?

Moin,
seit einiger Zeit stochere ich hieran herum, finde aber keinen neuen 
Ansatz oder gar eine Lösung dafür. Bitte schaut mal mit Kenneraugen 
darauf.
1
$ make 
2
Building Library
3
Building Lichterkette
4
Lichterkette.c: In function 'changeColorsInLEDs':
5
Lichterkette.c:46:5: error: 'led' undeclared (first use in this function)
6
     led[i].r = 0;    led[i].g = 0;    led[i].b = 0;
7
     ^
8
Lichterkette.c:46:5: note: each undeclared identifier is reported only once for each function it appears in
9
Lichterkette.c: In function 'main':
10
Lichterkette.c:66:14: warning: unused variable 'led' [-Wunused-variable]
11
  struct cRGB led[ramPrefs.numLED]; 
12
              ^
13
make: *** [Lichterkette] Error 1
14
$

Die Lib, die hier erfolgreich gebaut wurde, ist die ws2812b von Tim, die 
hier ja in einigen Threads behandelt wird.

Diese Compilerbeschwerden sind natürlich kein Einzelfall, auch hier im 
Forum tauchen die auf, jedoch waren die gesichteten Fälle stets 
vergessene #define oder kleinere Unachtsamkeiten.

Mein Code übersetzte tadellos bis zu dem Zeitpunkt, als ich die 
Codeschnipsel für die Fälle 'd' und 'n' in die Funktion 
changeColorsInLEDs() auslagerte. Jetzt motzt der Compiler, daß eben eine 
Deklaration noch nicht erfolgt sei. Wenn ich die Funktion, die zZt 
oberhalb der main() liegt, einfach mal nach ganz unten packe, kriege ich 
dieselben Beschwerden, nur mit vertauschter Reihenfolge von Warning und 
Error und mit anderen Zeilennummern. Die Strategie des gcc ist scheinbar 
nicht vom Anfang bis zum Ende.

Der banale Tip bzw. Ansatz wäre, die Fkt. changeColorsInLEDs() doch 
wieder einfach seinzulassen und deren Codehappen zurück in main() zu 
packen. Der ist aber sehr ungeeignet, da ich ja noch einiges mehr in die 
Fkt. reinpacken will und damit redundanten Code vermeiden will und eig. 
alles erreichen will, warum man Funktionen baut.

Wie kriege ich diesen Deadlock weg?

VG, Jan.
Angehängte Dateien:
Moderator Persönliche Seite #4160093
Lesenswert?

Nun, eine lokale Variable der Funktion main() ist nunmal nur
innerhalb dieser sichtbar.  Die kannst du nicht in einer völlig
anderen Funktion bearbeiten.

Zwei Möglichkeiten:

* Die Variable “led” global (bzw. modulintern) definieren.

* Einen Zeiger auf die (main()-lokale) Variable beim Aufruf der Funktion
übergeben, und dort die Variable über diesen Zeiger manipulieren.
#4160096
Lesenswert?

Jan R. schrieb:

> Die Strategie des gcc ist scheinbar
> nicht vom Anfang bis zum Ende.

Doch, die ist es.
Aber nicht so, wie du dir das vorstellst, dass die Aufrufhierarchie die 
Richtung vom Anfang bis zum Ende definiert, sondern viel banaler:
Da gibt es ein Textfile, das wird von der ersten Zeile bis zur letzten 
Zeile gelesen. In genau dieser Reihenfolge. Von oben nach unten. Einfach 
nur Text. Nicht mehr.

>
> Der banale Tip

Der banale Tip wäre, ganz einfach mal C zu lernen anstatt deine 
Unkentniss dem Compiler in die Schuhe schieben zu wollen. Und diese 
'Strategie' solltest du dir besser erst mal zu eigen machen: Wenn der 
Compiler dir einen Fehler meldet, dann hast DU einen Fehler gemacht 
und nicht der Compiler. Die Wahrscheinlichkeit, dass du auf deinem Level 
einen Compilerfehler findest, ist nahezu bei 0. Bis auf weiteres gilt: 
Der Compiler kann wesentlich besser C als du.

1
void foo()
2
{
3
  i = 5;
4
}
5

6
int main()
7
{
8
  int i;
9

10
  foo();
11
}

die Variable i ist funktionslokal. Ausserhalb von main existiert sie 
nicht. foo ist ausserhalb von main(). Wie also soll der Zugriff aus foo 
heraus erfolgen?

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