hi,
also die zweite meldung sagt das du in einer eingebundenen datei am ende der datei keine neue zeile hast.
MfG Martin
Hallo,
nachdem ich heute schon das Erfolgserlebnis hatte, indem ich es geschafft habe den Interrupt meines Timers zu verwenden, wollte ich mich mal den Compilerwarnungen annehmen.
Ich habe auch schon einige beseitigen können (z.B. = statt |= geschrieben usw.) aber nun habe ich noch zwei die mir irgendwie gar nichts sagen (zumindest nicht warum sie eigentlich kommen.
Das sind:
Könntet Ihr mir da einen Tip zu geben? Was mache ich falsch?Code:warning: function declaration isn't a prototype warning: no newline at end of file
mfG Henry
hi,
also die zweite meldung sagt das du in einer eingebundenen datei am ende der datei keine neue zeile hast.
MfG Martin
Danke,
damit wäre die schon einmal erledigt.
Der Compiler ist aber auch empfindlich
Nun müßte ich nur noch wissen warum meine Funktionsdeclaration kein Prototyp ist
mfG Henry
Vielleicht zeigst du mal die Zeile und die eigentliche Funktion?
Hallo,
kein Problem.
der Aufruf in main() sieht so aus
und die Funktionen so:Code:void init_digital(); // Ports initialisieren (eigene Funktion) void init_timer(); // Timer initialisieren (eigene Funktion)
Code:void init_digital() /*Diese Funktion initialisiert die verwendeten Ports*/ { DDRB |= (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5); //Bit 1 bis Bit 5 an Port B als Ausgang belegen DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5); //Bit 0 bis Bit 5 an Port C als Ausgang belegen }Die beiden Funktionen befinden sich jeweils in einer eigenen Datei (*.c). Sogar in der Zeile wo die erste Geschwungene Klammer der Mainfunktion ist wird diese Meldung ausgegeben.Code:void init_timer() { TCCR0 |= (1<<CS00) | (1<<CS02); //Vorteiler auf 1024 gewählt TIMSK |= (1<<TOIE0); //Interupt für Timer0 Overflow einschalten }
mfG Henry
Hallo,
ich habe gerade herausgefunden warum die Meldung "warning: function declaration isn't a prototype" kommt.
Ich muss die Funktion wie folgr aufrufen damit die Meldung nicht mehr erscheint:
Danke für eure Hilfe, das Problem ist damit gelöstCode:void init_digital(void);
mfG Henry
Hallo,
leider muss ich das Thema noch einmal aufgreifen.
Wenn ich in die Aufrufe void eintrage läuft das Programm nicht mehr.
Könnte mir da doch noch jemand einen Tip geben was da der Fehler sein könnte wenn die Compilerwarnung kommt
DankeCode:warning: function declaration isn't a prototype
mfG Henry
parameterlose Funktionen ohne Rückgabewert ruft man mit Funktionsname(); auf, du kannst (bzw. solltest) also auch das erste void weglassen.
(bei den Funktionsdefinitionen bzw. -deklarationen hingegen sollte ein void in der Klammer stehen)
Code://main.c #include "modul_a.h" main() { Func_a1(); Func_a2(10); } //modul_a.h void Func_a1(void); void Func_a2(int); //modul_a.c #include "modul_a.h" void Func_a1(void) { ... Code ... } void Func_a2(int x) { ... Code ... }
So viele Treppen und so wenig Zeit!
Hallo Henry,
die Warnung "function declaration isn't a prototype" kannst Du bedenkenlos ignorieren. In c ist es möglich, Prototypen von Funktionen zu erstellen, in dem man einfach vor die Deklararion den Funtionsnamen sowie die Parameter angibt und mit einem ';' abschließt. Die kann nötig sein, wenn eine Funktion eine andere aufrufen muss, die aber erst später deklariert wurde. z.b.:
Wenn Du den Prototypen weglässt, dann meldet der Compiler einen Fehler, weil "ausgeben" ja erst später deklariert wird. Die Meldeung "function declaration isn't a prototype" besagt lediglich, dass kein Prototyp für die Funktion deklariert wurde. Wenn Du einen Prototypen erstellst, ist die Meldung weg, aber der Code bleibt der gleiche. Siehe auch https://www.roboternetz.de/wissen/in...ial#PrototypenCode:#include <stdio.h> void ausgeben (int zahl); /* Der Prototyp */ int main (void) { ausgeben (12); return 0; } void ausgeben (int zahl) /* Die eigentliche Prozedur */ { printf ("Ausgabe: %d\n", zahl); }
MfG Mark
Das ist nicht die gesamte Warnung. GCC zeigt dir auch die Nummer der betreffenden Zeile in der Quelle an.Zitat von Henry
Bei dir hat es so auszusehen:
Code://Prototyp (im Header/Kopf der C-Quelle extern void foo (void); //oder static void foo (void); // Implementierung void foo (void) { ... } // Aufruf ... { foo(); }Nein. Warnungen sollte man *nie* bedenkenlos ognorieren! Ist gibt Fälle, wo durch weggelassene/nicht korrekte Prototypen falscher Code erzeugt wird. Und das wirst du erst merken zur Laufzeit, wenn das Programm irgendwo abschmiert weil Callinterfaces nicht passen.Zitat von p_mork
Ein Programm ohne Fehler zu compilieren bedeutet nicht, daß das Programm korrekt ist.
Disclaimer: none. Sue me.
Lesezeichen