Forum: Compiler & IDEs Warum Variable in Unterprogramm "undeclared"?


von Michael D. (etzen_michi)


Angehängte Dateien:

Lesenswert?

Nabend.

Suche habe ich bereits bemüht, aber nichts gefunden.

Ich habe das Problem das dieses Programm richtig geht wenn ich das 
aneinander schreibe.
Sobald ich den unteren Teil auslager in eine andere Datei (Programme.c) 
heißt es das im Programm "ChooseColor" die Variable temp unndeclared 
ist.

Woran kann das liegen?
Wie kann ich das beheben?
Das Unterprogramm muss auf GENAU die gleiche Variable zugreifen wie das 
Hauptprogramm.
1
#include "files.h"
2
3
4
#define Blinkgeschwindigkeit 30
5
6
int temp;
7
8
int main () {
9
Konfiguration();
10
SetColor(Aus);
11
12
while(1)    {
13
14
ChooseColor();
15
16
    }
17
18
19
}
1
void ChooseColor(int Keys)  {
2
    Keys=PINC;
3
    PINC&=0x01;
4
    
5
    switch(Keys)    {
6
        case 0:
7
            SetColor(++temp);
8
            break;
9
        default:            
10
            break;
11
        }
12
    do  {
13
    Keys=PINC;
14
    PINC&=0x01;
15
    }   while(Keys<=0);
16
    _delay_ms(3);
17
}

von Floh (Gast)


Lesenswert?

Michael Dierken schrieb:
> Woran kann das liegen?
> Wie kann ich das beheben?

Stichwort extern in einem C-Buch.

von Kali (Gast)


Lesenswert?

Zunächst einmal ein C-Buch besorgen und lesen.

Du musst Dir darüber klarwerden, das C-Dateien immer für sich übersetzt 
werden und nicht etwa erst im Speicher gesammelt werden um dann 
übersetzt zu werden.
Daraus folgt, das bei der Übersetztung der Datei mit der Funktion dem 
Compiler nicht bekannt ist, dass sich in der anderen Datei eine 
Definition für eine verwendete Variable befindet.

Um dem Compiler das mitzuteilen, musst Du in der zweiten Datei eine 
Deklaration einfügen.
1
extern int temp;

Ganz allgemein ergibt sich ohnehin oft die Notwendigkeit so wenig wie 
möglich globale Variablen zu verwenden. Um das zu erreichen und 
Variablen ändern zu können übergibt man Zeiger auf diese Variablen. 
Näheres dazu steht im erwähnten C-Buch.

von Michael D. (etzen_michi)


Lesenswert?

ahh .. mit der ersten Antwort habe ich es gelöst und mit der zweiten 
verstanden.

Ich hatte sozusagen zuerst das Programm im Compiler und danach die 
Variable.
Also erst Variable laden und dann Programme.

Nun ist noch das Problem (was ich eig an meinen ersten Post anhängen 
wollte, wo dann aber mein I-Net schwach gemacht hat die meldung:

../Rumspielen_C.c:13: error: too few arguments to function 'ChooseColor'

Auch hier wieder: Wenn das Programm direkt unter dem Hauptprogramm steht 
läufts, wenn nicht nur wenn ich irgendeinen Wert übergebe ...


Zum Buch: Habe n Online Tutorial da habe ich aber nichts dazu gefunden.

von tobi (Gast)


Lesenswert?

Nun, ich glaube, so ein Buch wär echt nicht die schlechteste Idee...

Auch mal die Warnings vom Compiler einschalten...

Naja,
also ChooseColor() ist in main() sog. implizit definiert -- ohne 
Parameter.
Dein Funktion ChooseColor(int) will aber einen (den du dann in Deiner 
Funktion nicht verwendest, sonder mit PINC überschreibst...

Wie gesagt, Dein Tutorium ist für Dich noch ein wenig zu 
fortgeschritten, denke ich...

von Kali (Gast)


Lesenswert?

>Ich hatte sozusagen zuerst das Programm im Compiler und danach die
>Variable. Also erst Variable laden und dann Programme.

Ahem. Naja. So ungefähr. Aber auch nur entfernt.
Na das lernst Du noch. Lies dringend ein C-Buch!

Bei der Funktion hast Du ein öhnliches Problem.
Wenn der Compiler die erste Datei liest (egal ob als erstes oder als 
letzte) dann sieht er das Du eine ansonsten unbekannte Funktoin ohne 
Parameter aufrufst.
Wenn er die zweite Datei liest, (wiederrum egal ob er das vor oder nach 
der ersten tut) dann sieht er eine Funktion mit Parameter.
Beim linken (dem letzten Schritt) hat er nun den Aufruf einer Funktion 
ohne Parameter und eine Funktion diesen Namens aber mit Parameter.
Das ist ein Widerspruch!

Du musst in der ersten Datei (im allgemeinen allerdings in einer 
include-Datei) eine Deklaration der Funktionen haben, die Du aufrufen 
willst und die in anderen C-Dateien definiert sind.


>Zum Buch: Habe n Online Tutorial da habe ich aber nichts dazu gefunden.

Schmeiss es weg. Das ist absoluter Grundlagenstoff. Ein Tutorial, das 
darüber nichts sagt ist schlicht Schrott. Hier mal ein online C-Buch: 
http://openbook.galileocomputing.de/c_von_a_bis_z/index.htm

Lies ein C-Buch! Lies ein C-Buch! Lies ein C-Buch!

von Michael D. (etzen_michi)


Lesenswert?

In der Datei files.h rufe ich zuerst die Prototypes.h und dann die 
Programme.c auf.

Naja .. Buch bestellt mal schauen was wird.

Vielen Dank auf jeden Fall schonmal (wieder).

von Karl H. (kbuchegg)


Lesenswert?

Michael Dierken schrieb:
> In der Datei files.h rufe ich zuerst die Prototypes.h und dann die
> Programme.c auf.

Du "rufst" in einer Header Datei keine "Funktion auf". Und schon gar 
nicht rufst du ein Protoypes.h oder ein Programme.c auf.

Du schreibst nur hin. Ein Funktionsaufruf ist etwas ganz anderes.

> Naja .. Buch bestellt mal schauen was wird.

Gut.
In der Programmierung ist es wichtig, dass man systematisch vom 
einfachen zum schwierigen vorgeht. Zusammenfragen von Halbwissen in 
einem Forum kann dieses niemals ersetzen. Und auch die meisten 
Online-Tutorials sind so, dass der Verfasser zwar mit viel Enthusiasmus 
an die Sache rangeht, dann aber auf mahr als die Hälfte vergisst oder 
nicht hinschreibt und irgendwann verliert er die Lust am 
Tutorial-Schreiben. Und einige Tutorials sind ganz einfach nur so mit 
Falschinformationen gespickt.

Nicht umsonst hat ein ernstzunehmendes C-Buch mehr als 150 Seiten, die 
meisten Online-Tutorials aber weniger als 40.

von Martin (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> dass der Verfasser zwar mit viel Enthusiasmus

...aber im allgemeinen mit sehr wenig Ahnung.

Ich bin ja nun auch kein C-Guru, aber was man da in aller Regel so 
liest, ist nicht nur unter language-lawyer-Gesichtspunkten falsch, 
sondern auch so geschrieben, daß es "in die Nähe der Wahrheit" kommt, so 
daß es dem Anfänger gar nicht komisch vorkommt. Daß er dann aber in 
anderem Zusammenhang plötzlich auf die Nase fällt, weil die Erklärung im 
Tutorial eben doch falsch war.

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.