Forum: Compiler & IDEs Sourcefile bei WinAVR


von Tim Kranich (Gast)


Lesenswert?

Ich hab mal eine kleines Frage zum einbinden von Sourcefiles unter
Verwendung des Programms Mfile.
Dort existiert ja die Möglichkeit C/C++ sourcefile(s) anzugeben. Ich
kenne es nur so, dass man bei der Aufspaltung seines Projects in C mit
Header Dateien arbeitet. Wie kann ich denn die Verbindung zwischen
Sourcefile und Headerfile erstellen. Oder include ich im Hauptprogramm
einfach ein "XXX.c" Das sieht ganz schön seltsam aus.

Wenn mir jedmand weiterhelfen kann, bin ich ihm sehr dankbar.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Die C-Dateien gibst du im Makefile an.

.h-Dateien baust du dazu (entweder eine einzige fürs ganze Projekt
oder eine pro C-Datei, wie du gern magst), um die exportierten Daten,
Typen und Funktionen der einzelnen C-Dateien den anderen C-Dateien
kund zu tun.  Diese werden dann mittels #include in die C-Dateien
eingebunden, damit sie Kenntnis bekommen, welche Sachen in den
anderen C-Dateien vorhanden sind.

von Tim Kranich (Gast)


Lesenswert?

Das klingt gut. Genau so möchte ich es gerne haben aber nun bekomme ich
die Fehlermeldung:

warning: function declaration isn't a prototype

wenn die Funktionen Parameter erwarten. Wie kann ich diesen Fehler
vermeiden???

von Hans (Gast)


Lesenswert?

du schreibst in c => nix void foo() sonder void foo(void) ;)

73

von Tim Kranich (Gast)


Lesenswert?

Ich gebe mal am besten noch den Quellcode an, sonst redet man eventuell
nur aneinander vorbei:

Header:
1
static void SSA_test (void);
2
static void get_digit (uint8_t num, uint8_t digit[]);
3
static void num_test (uint8_t num);

Source:
1
  uint8_t SSA[10] = {238, 6, 205, 233, 99, 171, 175, 224, 239, 235};
2
3
void SSA_test (void) {
4
  uint8_t i;
5
  for (i=0; i<10; i++) {
6
    PORTA = SSA[i];
7
    _delay_ms(500);
8
  }
9
}
10
11
void get_digit (uint8_t num, uint8_t digit[]) {
12
  digit[0] = num / 100;
13
  num %= 100;
14
  digit[1] = num / 10;
15
  digit[2] = num %= 10;
16
}
17
18
19
void num_test (uint8_t num) {
20
  uint8_t digit[3];
21
  get_digit (num, digit);
22
  uint8_t i;
23
  for (i=0; i<3; i++) {
24
    PORTA = SSA[digit[i]];
25
    _delay_ms(500);
26
  }
27
}

Also nur bei den unteren Funktionen im Header ärgert er mich. Wenn ich
noch irgendwelche Fehler gemacht habe, könnt ihr mich gerne darauf
hinweisen. Ich lerne gerne g

von Hans (Gast)


Lesenswert?

gut da war ich etwas zu schnell ;)

mach statt
static void SSA_test (void);

void SSA_test (void);

btw wtf soll static bei so ner lustigen funktion??? ich sehe schon sinn
dabei wenns sich um klassen dreht aber in c???

73

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> btw wtf soll static bei so ner lustigen funktion??? ich sehe schon
> sinn dabei wenns sich um klassen dreht aber in c?

Guter Programmierstil.  Alles, was nicht exportiert sein muss, soll
auch nicht exportiert werden.

von Hans (Gast)


Lesenswert?

gut das jetzt WE ist.. da werd ich dann gleich mal ansi wälzen...

wie meinst du exportiert??? aus dem file raus oder wie ???

und warum zum teufel tut der dann da meinen, dass das kein prototyp
ist???

73

von Tim Kranich (Gast)


Lesenswert?

Sorry wegen dem static. Das war auch nur ein verzweifelter Versuch den
Fehler zu beseitigen. Doch auch ohne static bekomme ich immer noch
diese Fehlermeldung. Habt ihr vielleicht noch nen kleinen Denkanstoß
für mich heute morgen?

von Hans (Gast)


Lesenswert?

meiner meinung nach müssste
void SSA_test (void) {
so aussehen..

void SSA_test () {

wobei ich mir da nicht sicher bin..

vergleich mal die zeile wo sich der compiler aufregt mit der zeile wo
die funktion beginnt... wenn die gleich sind void weg.. sonnst unserren
gcc-guru befragen G

73

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> wie meinst du exportiert??? aus dem file raus oder wie ???

Ja, ohne "static" ist der Bezeichner global (über alle Module)
bekannt, sonst nur innerhalb des Moduls.  Ergo, alles was man nur
innerhalb braucht, macht man static.

> meiner meinung nach müssste
> void SSA_test (void) {
> so aussehen..
> void SSA_test () {

In C++ wäre beides dasselbe, in C nicht.  In C wäre letzteres eine
non-prototype declaration (falls es selbst die Deklaration darstellt,
im Beispiel stand aber eine drüber und es ist nur die Definition).

Nö, aus dem geposteten Quelltext ist nicht ersichtlich, was der
Compiler wo bemängelt haben sollte.

von Tim Kranich (Gast)


Lesenswert?

wie oben schon gesagt, meckert er nur bei den beiden unteren Funktionen
mit Parameter (das verstehe ich ja gerade nicht). Der genaue Fehler
lautet:

8bitbcd.h:2: error: parse error before "num"
8bitbcd.h:2: warning: function declaration isn't a prototype
8bitbcd.h:3: error: parse error before "num"
8bitbcd.h:3: warning: function declaration isn't a prototype

wobei die Headerdatei bislang auch nur aus diesen ersten drei Zeilen
besteht, die ich oben schon gepostet habe.

von Hans (Gast)


Lesenswert?

hast du den comischen int-header im include ?? ;)

der kennt nämlich den uint8_t nicht...

73

von Tim Kranich (Gast)


Lesenswert?

Das klingt ganz gut.... Muss aber leider kurz mal ne Pause einlegen...
Werde es ausprobieren und mich dann später wieder melden. Vielendank
aber schon mal für eure zahlreiche Hilfe. Bin immer wieder froh, dass
es  Leute wie euch gibt.

von Tim Kranich (Gast)


Lesenswert?

Mist... ich kann mich einfach nicht vom PC losreißen aber dafür war dein
Tip richtig, Hans. Ihm felhte die <stdint.h>. Nochmals vielen Dank!
Vielleicht kann ich mich ja mal revangieren.

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.