Forum: PC-Programmierung COSMIC liefert merkwürdigen Fehler bei C-Datei


von Max M. (maxmicr)


Lesenswert?

Hallo,
ich versuche gerade, diverse Funktionen in Dateien auszulagern damit 
mein Code übersichtlicher wird.
Dabei hab ich eine klassische delay Funktion geschrieben.
Zuerst hab ich eine Header-Datei so erstellt:
1
void delayms(uint16_t ms);

dann meine Datei *delay.c*:
1
void delayms(uint16_t ms){
2
  while(--ms){
3
    uint16_t i = 0;
4
    for(i = 0; i < ms; i++{
5
      nop();
6
    }
7
  }
8
}

versuche ich das ganze nun zu kompilieren, kommt diese Fehlermeldung:
1
#error cpstm8 delay.c:1(13+8) missing )
2
#error cpstm8 delay.c:3(16) missing ;
3
#error cpstm8 delay.c:4(11) incomplete declaration
4
#error cpstm8 delay.c:4(13) missing ;
5
#error cpstm8 delay.c:4(21) missing ;
6
#error cpstm8 delay.c:5(8) missing ;
7
#error cpstm8 delay.c:8(0) incomplete declaration
8
delay.c:
9
 The command: "cxstm8 -istm8_periph_libs\inc +debug -pxp -no -l +mods0 -pp -i"C:\Program Files (x86)\COSMIC\FSE_Compilers\Hstm8"  -clDebug\ -coDebug\ delay.c " has failed, the returned value is: 1
10
exit code=1.

Wenn ich den gleichen Code jedoch in meinem Projekt benutze, wird 
einwandfrei kompiliert?
Wo liegt mein Fehler?

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Wo liegt mein Fehler?

Steht doch dort: er kennt uint16_t nicht.

von Max M. (maxmicr)


Lesenswert?

Wo steht das? Ich sehe nur Fehlermeldungen, dass ich angeblich Klammern 
vergessen habe?
Anyway: warum kennt er kein uint16_t? Im Hauptprogramm gibts das ja 
auch?

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Wo steht das?

Zeilen und Spalten auszählen (eine brauchbare IDE macht das für Dich, 
sonst händisch), er meckert am Ende der 'uint16_t'. Und er beschwert 
sich, dass i 'incomplete' ist.

> Anyway: warum kennt er kein uint16_t?

Weil Du es ihm nicht bekannt gemacht hast. Entweder selber (typdef, 
define ∗hüstel∗) oder vorgefertig (Stichwort stdint.h/inttypes.h)

HTH

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Max M. schrieb:
> while(--ms){
>     uint16_t i = 0;
>     for(i = 0; i < ms; i++{
>       nop();
>     }
>   }

Seh ich das richtig? Du möchtest n*(n-1)=n²-n mal "nop" durchführen? War 
das beabsichtigt?!

von Max M. (maxmicr)


Lesenswert?

Das kann doch nicht sein, dass ich dem Compiler die Datentypen nochmal 
erklären muss? Ich hab diverse andere Dateien erstellt in denen 
Funktionen sind, die auch Datentypen beinhalten (z.B. long, char) und da 
klappts auch ohne Fehlermeldung!

Niklas G. schrieb:
> Seh ich das richtig? Du möchtest n*(n-1)=n²-n mal "nop" durchführen? War
> das beabsichtigt?!

Ja, wieso?

: Bearbeitet durch User
von Forward (Gast)


Lesenswert?

Blödinn, die for Schleife ist nicht mit ) geschlossen.

Im Header sollte extern deklariert werden.

von Max M. (maxmicr)


Lesenswert?

Das kommt noch dazu, klappt aber leider trotzdem nicht :(
1
extern void delayms(uint16_t ms);
1
void delayms(uint16_t ms){
2
  while(--ms){
3
    uint16_t i = 0;
4
    for(i = 0; i < ms; i++){
5
      nop();
6
    }
7
  }
8
}

von g457 (Gast)


Lesenswert?

> Das kann doch nicht sein, dass ich dem Compiler die Datentypen nochmal
> erklären muss? Ich hab diverse andere Dateien erstellt in denen
> Funktionen sind, die auch Datentypen beinhalten (z.B. long, char) und da
> klappts auch ohne Fehlermeldung!

Im Gegensatz zu long und char sind ∗int∗_t keine keine nativen 
Datentypen im Sinne des Vorhandenseins im Grundstock der Typen. Sie 
wurden in C99 standardisiert, dafür gibts die stdint.h.

Für weitere Fragen in diese Richtung ein x-beliebiges Lehrbuch zu C oder 
einfach den Standard lesen.

HTH

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Max M. schrieb:
> Das kann doch nicht sein, dass ich dem Compiler die Datentypen nochmal
> erklären muss?
Doch, musst du.

Max M. schrieb:
> Ich hab diverse andere Dateien erstellt in denen
> Funktionen sind, die auch Datentypen beinhalten (z.B. long, char) und da
> klappts auch ohne Fehlermeldung!
(unsigned/short/signed/long) char, short, int, long, float, double sind 
"built-in" Typen, die kennt der Compiler so. Alle anderen Typen muss man 
ihm erst beibringen. Für uint16_t und co gibt es die <stdint.h> .

Max M. schrieb:
> Ja, wieso?
Klingt etwas ungewöhnlich, ein Delay mit quadratischer Laufzeit. Der 
Name "ms", also Millisekunden, ist dann etwas irreführend.

von Forward (Gast)


Lesenswert?

Wie lauten die Meldungen?

von Carl D. (jcw2)


Lesenswert?

Max M. schrieb:
> Wo steht das? Ich sehe nur Fehlermeldungen, dass ich angeblich Klammern
> vergessen habe?
> Anyway: warum kennt er kein uint16_t? Im Hauptprogramm gibts das ja
> auch?

Dort gibt es sicher auch ein
1
#include <stdint.h>
oder
1
#include <inttypes.h>

Normales int ist eben 16,32 Ode 64 Bit breit und int16_t dann eben int 
oder short oder was auch immer die Plattform braucht.

: Bearbeitet durch User
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.