Forum: Mikrocontroller und Digitale Elektronik Dateiverwaltungs-Problem?


von Joachim .. (joachim_01)


Lesenswert?

Datei main.h:
1
int8_t flagSelectPID = 0, selectPID1 = 0;

Datei PIDControl.h:
1
extern int8_t selectPID1;
2
void selectPID(void);

Datei PIDControl.c:
1
#include "PIDControl.h"
2
void selectPID(void) {
3
  switch(selectPID1) 
4
  {
5
  ...
6
  ...
7
  }
8
}
Sollte doch eigentlich passen, oder?

Stattdessen kommt:
Error  6  'selectPID1' undeclared (first use in this function)
Error  5  expected '=', ',', ';', 'asm' or '__attribute__' before 
'selectPID1'

Mir scheint dass das Prob ausserhalb liegt... als ob auf main.h gar kein 
Bezug genommen würde...? Ich habe in PIDControl.h ein paar Deklarationen 
auskommentiert - was den Compiler völlig kalt ließ. Ich arbeite mit 
AVRStudio6 und habe die Dateien wie üblich zum Projekt hinzugefügt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wer includet denn nun 'main.h'? Mit 'extern int8_t selectPID1;' sagst du 
zwar, das die Variable irgendwo anders erklärt wird, aber irgendwo musst 
du main.h schon inkludieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim ... schrieb:
> Datei main.h:
> int8_t flagSelectPID = 0, selectPID1 = 0;

Das gehört da nicht 'rein, das sind Variablendefinitionen und 
-Initialisierungen. So etwas hat in einer .h-Datei nichts zu suchen.

Lies Dir mal in Deinem C-Buch den Abschnitt über Headerdateien durch.

von C-user (Gast)


Lesenswert?

Joachim ... schrieb:
> Error  6  'selectPID1' undeclared (first use in this function)

der Compiler behauptet in einer Function zu sein und geschachtelte 
Funktionen gibt es in C nicht.

Vielleicht einfach mal ALLES in ein File kopieren(/posten).

von Joachim .. (joachim_01)


Lesenswert?

>Vielleicht einfach mal ALLES in ein File kopieren(/posten).
Das ist genau das was ich nicht möchte.

>Mit 'extern int8_t selectPID1;' sagst du zwar, das die Variable irgendwo >anders 
erklärt wird, aber irgendwo musst du main.h schon inkludieren.
Hm. Das heißt, ich müßte dann im entsprechenden C-File, hier also 
PIDControl.c main.h inkludieren... Den Verdacht hab ich auch - hab dann 
aber das Prob das viele Deklarationen doppelt vorkommen... hmmm... 
trotzdem mal probieren.

von Karl H. (kbuchegg)


Lesenswert?

Joachim ... schrieb:
>>Vielleicht einfach mal ALLES in ein File kopieren(/posten).
> Das ist genau das was ich nicht möchte.
>
>>Mit 'extern int8_t selectPID1;' sagst du zwar, das die Variable irgendwo >anders
> erklärt wird, aber irgendwo musst du main.h schon inkludieren.
> Hm. Das heißt, ich müßte dann im entsprechenden C-File, hier also
> PIDControl.c main.h inkludieren...

Nein!

Aber es muss ein C-File geben, in dem zb deine main() ist.
Und in die müsstest du main.h inkluden.


Aber eigentlich ist auch das der falsche Weg. Denn wenn ich mich an der 
Namensgebung orientiere, dann gehört ja eine Variable "selectPID1 " 
logisch gesehen zur PIDControl. Also muss sie dort auch rein

Datei PIDControl.h:
1
void selectPID(void);
2
extern int8_t selectPID1;

Datei PIDControl.c:
1
#include "PIDControl.h"
2
3
int8_t selectPID1 = 0;
4
5
void selectPID(void) {
6
  switch(selectPID1) 
7
  {
8
  ...
9
  ...
10
  }

Lass Variablen nach Möglichkeit immer bei dem Modul, zu dem sie gehören!
Es gibt keine Verpflichtung, dass die Definitionen externer Variablen an 
einer Stelle zusammengefasst werden müssen. Dafür hast du ja einen 
Linker.

von Karl H. (kbuchegg)


Lesenswert?

Allerdings ist das hier

> Stattdessen kommt:
> Error  6  'selectPID1' undeclared (first use in this function)
> Error  5  expected '=', ',', ';', 'asm' or '__attribute__' before
> 'selectPID1'

ein ganz anderer Fehler.

Der COmpiler beschwert sich nicht darüber, dass er selectPID1 nicht 
kennen würde, sondern darüber, dass er mit int8_t nix anfangen kann.

Dir fehlt ein include auf <stdint.h>


(Die entscheidende Fehlermeldung ist der Error 5:
 BEFORE selectPID1

Error 6 ist nur noch Folgefehler davon.

von Joachim .. (joachim_01)


Lesenswert?

Volltreffer!
Vielen Dank. Das eigenartige war nämlich, daß es mit:
typedef unsigned char Byte;
und entsprechend
Byte SelectPID... keine Probleme gab. Auch scheint es mir ein großer 
Trugschluß, daß int8_t und signed char 100% gleich sind... aber das nur 
am Rande.

Gruß von der Costa Brava; Hast ein cerveza gratuita bei mir gut.

J.

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.