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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.