Forum: Compiler & IDEs GCC Fehlermeldung


von Tom (Gast)


Lesenswert?

Hallo Leute,

hab ein Problem mit einer Fehlermeldung aus
der ich nicht ganz schlau werde.

 unterminated argument list invoking macro "outp"

und später

 'outp' undeclared (first use in this function)
 (Each undeclared identifier is reported only
 once for each function it appears in)
 parse error at end of file

Der Fehler soll in main liegen(?) aber
das besteht nur aus Endlosschleife und
Funktionsaufruf.

Danke, Tom

von Berndt Brandes (Gast)


Lesenswert?

Du benutzt das Macro "outp"?
Dieses Macro soll man nicht mehr benutzen, benutze stattdessen direkte
Zweisungen an die Ports.
Außerdem scheint was mit deinem Aufruf nicht zu stimmen. Wie sieht die
Zeile der ersten Fehlermeldung denn aus?

/Berndt

von Tom (Gast)


Lesenswert?

Der "outp"-Aufruf müsste stimmen, benutze ihn
auch schon früher um den Timer-Registern die
Werte zuzuweisen.

Direkte Zuweisungen funktionieren nicht,
da er dann die Register nicht kennt.

TCNT1 = 0x01FF

Hab ich vergessen was zu includieren,
benutze, IO.h und Signal.h

von Tom (Gast)


Lesenswert?

Übrigens versuch ich mit "outp" einen 16Bit wert in
OCR1B zu schreiben, ist es möglich das man dieses
Register nicht vollständig beschreiben kann.

Les grad was das man zuerst OCR1BH und dann OCR1BL
beschreiben muss, könnte das das Problem sein.
Leider kann ich's jetzt nicht checken.

von Berndt Brandes (Gast)


Lesenswert?

outp war mal, ist aber nicht mehr!

nicht io.h sondern avr/io.h benutzen und immer schön dem Compiler den
CPU typ sagen (-mmcu=atmega8 oder so), dann kennt der Compiler auch die
Register, er weiß auch ob's 16 Bit sein müssen und er kennt dann auch
(selbstverständlich) eventuelle Schreib- und Lesefolgen.

Welche Compilerversion benutzt Du?
Welche Warnungen (alle!) und Fehler siehst du?

/Berndt

von Berndt Brandes (Gast)


Lesenswert?

unterminated argument list invoking macro "outp"
heißt für mich das die Argumentliste des Macros nicht abgeschlossen
ist, also vielleicht die schließende Klammer fehlt oder so was.

/Berndt

von Domagoj Mihalic (Gast)


Lesenswert?

Falls der Compiler, wie du meinst die Register beim
direkten Aufruf nicht erkennt liegt das problem nicht bei outp,
die Register müssen auf jeden Fall erkannt werden (wie sollte
denn sonst der Quellcode von outp funktionieren).

von Tom (Gast)


Lesenswert?

Danke das Problem hat sich gelöst,
hatte einen Fehler bein includieren von io.h!

Allerdings hab ich jetzt mit ein paar anderen
Fehlermeldungen und Warungen zu kämpfen.
Vielleicht gibt's ja auch hier ganz einfache
Lösungen, bin für alles dankbar!


sim.c: In function `output_funktion':

sim.c:79: warning: return type of `main' is not `int'
" void main(void) ", ich geb nix zurück aus main

sim.c:79: warning: `main' is normally a non-static function
sim.c:85:3: warning: no newline at end of file

sim.c:85: error: parse error at end of input (?)

Tom

von Berndt Brandes (Gast)


Lesenswert?

GCC verlangt von main(), das es einen int zurückliefert, sonst hast Du
immer diese Warnung, da geht kein Weg dran vorbei. Ich weiß zwar auch
nicht, was mit dem Rückgabewert passiert, aber so ist das nun mal.

Poste doch mal Dein sim.c, wenn's kein Geheimnis ist. Dann sehen wir
vielleicht besser, was da los ist.

/Berndt

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Is kein Geheimnis! Hoff nur es funktioniert noch so weit,
hab was geändert aber kanns im Moment nicht checken.

zur INfo:
Das Programm soll die von main übergebene Bitfolge ausgeben.
Die einzelnen Bits, High und Low sollen im Tastverhältnis
codiert werden.

Danke, Tom!

von Berndt Brandes (Gast)


Lesenswert?

Fast wie ich vermutet habe: output_funktion() hat keine abschließende
}-Klammer, für den Compiler sieht das so aus, als ob Du versuchst
main() lokal in output_funktion() zu deklarieren (gibt dann warning:
`main' is normally a non-static function). Weiter fehlt ihm dann noch
eine schließende }-Klammer (daher der Parse-error).

Als Abschluß sollte für GCC immer eine Leerzeile im Quellfile sein,
sonst gibt's die Warnung: warning: no newline at end of file.

also: Fehlende Klammer rein, main() als int mit Rückgabewert 0 (führt
nicht zu mehr Assembler-Code, der Compiler erkennt die hier vorliegende
Situation, das main() nicht zurückkehrt) und noch eine Leerzeile und
alles sollte ok sein

/Berndt

von Tom (Gast)


Lesenswert?

Dummer Fehler, deshalb sollte man's einrücken.
Werds heut Abend mal ausprobieren!

von Berndt Brandes (Gast)


Lesenswert?

BTW: bit_anzahl ist nicht deklariert, die Abbruchbedingung Deiner
Ausgabeschleife würde ich nochmal überdenken. Wird so nicht gehen.
Ich schlage vor: while(bit_gesendet < protokollbits)?

Zum Abschluß dann nochmal warten auf (bit_start == 0), damit ein evtl
folgendes Byte nicht vor dem Ende des ersten angefangen wird?

/Berndt

von Tom (Gast)


Lesenswert?

Compilieren funktioniert jetzt einwandfrei, was
ich allerdings von der Funkion noch nicht behaupten
kann.
Beim debuggen zeigt mir AVRStudio4 an, dass für
eine integer-Variable 2 Register belegt werden.
Wie muß man einen 8Bit-Wert deklarieren?
(short, char (?) funkioniert nicht)

Das führt dann weiter dazu das eine Zählvariable
(global) beim Ausführen einer Funkion im RAM steht,
eine einfache Zuweisung
  bit_start = 1
ist dann nicht mehr möglich.
Wie macht man das am geschicktesten über Pointer,
aber wie weiß ich welcher RAM-Bereich benutzt wird?

Danke, Tom

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.