Archiv verlassen und diese Seite im Standarddesign anzeigen : Compilermeldungen?
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:
warning: function declaration isn't a prototype
warning: no newline at end of file
Könntet Ihr mir da einen Tip zu geben? Was mache ich falsch?
MartinFunk
31.03.2007, 17:48
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
Vielleicht zeigst du mal die Zeile und die eigentliche Funktion?
Hallo,
kein Problem.
der Aufruf in main() sieht so aus
void init_digital(); // Ports initialisieren (eigene Funktion)
void init_timer(); // Timer initialisieren (eigene Funktion)
und die Funktionen so:
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
}
void init_timer()
{
TCCR0 |= (1<<CS00) | (1<<CS02); //Vorteiler auf 1024 gewählt
TIMSK |= (1<<TOIE0); //Interupt für Timer0 Overflow einschalten
}
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.
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:
void init_digital(void);
Danke für eure Hilfe, das Problem ist damit gelöst
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
warning: function declaration isn't a prototype
Danke
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)
//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 ...
}
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.:
#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);
}
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/index.php/C-Tutorial#Prototypen
MfG Mark
SprinterSB
01.04.2007, 11:39
Könnte mir da doch noch jemand einen Tip geben was da der Fehler sein könnte wenn die Compilerwarnung kommt...
warning: function declaration isn't a prototype
Das ist nicht die gesamte Warnung. GCC zeigt dir auch die Nummer der betreffenden Zeile in der Quelle an.
Bei dir hat es so auszusehen:
//Prototyp (im Header/Kopf der C-Quelle
extern void foo (void);
//oder
static void foo (void);
// Implementierung
void foo (void)
{
...
}
// Aufruf
...
{
foo();
}
die Warnung [...] kannst Du bedenkenlos ignorieren.
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.
Ein Programm ohne Fehler zu compilieren bedeutet nicht, daß das Programm korrekt ist.
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.
echt? Kann ja sein, dass das stimmt, aber ich habs bisher immer ignoriert, und trotzem ist der Controller noch nie dadurch abgestürzt. Und wenn ich den Prototypen dazumache, hat GCC bei mir immer den gleichen Code erzeugt.
MfG Mark
Was glaubst du warum es Compilerwarnungen gibt? Warum gibt es zig Moeglichekeiten wie man dem Compiler sagen soll bei was er alles Warnungen ausgeben soll? Wenn du eine Warnung bekomst hast du falschen Code gemacht. Dass er dennoch funktioniert ist toll aber nicht sinn der Sache, Warnungen zu ignorieren.
Was glaubst du warum es Compilerwarnungen gibt? Warum gibt es zig Moeglichekeiten wie man dem Compiler sagen soll bei was er alles Warnungen ausgeben soll? Wenn du eine Warnung bekomst hast du falschen Code gemacht. Dass er dennoch funktioniert ist toll aber nicht sinn der Sache, Warnungen zu ignorieren.
ich weiss, wozu Warnungen da sind. Ich ignorier ja auch nicht alle Warnungen, sondern nur diese eine.
MfG Mark
Das ist nicht die gesamte Warnung. GCC zeigt dir auch die Nummer der betreffenden Zeile in der Quelle an.
Bei dir hat es so auszusehen:
//Prototyp (im Header/Kopf der C-Quelle
extern void foo (void);
//oder
static void foo (void);
// Implementierung
void foo (void)
{
...
}
// Aufruf
...
{
foo();
}
die Warnung [...] kannst Du bedenkenlos ignorieren.
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.
Ein Programm ohne Fehler zu compilieren bedeutet nicht, daß das Programm korrekt ist.
Danke euch ersteinmal allen für die Antworten.
Jetzt kommen keine Warnungen mehr und das Programm rennt auch (bis zum nächsten Fehler meinerseits ;) ).
@SprinterSB:
Das war es wohl, jetzt müßtest Du mir nur noch sagen wann ich extern und wann static verwende bzw. was der Unterschied ist
SprinterSB
02.04.2007, 09:26
Funktion ist nur im C-Modul bekannt:
--> Deklaration als "static" im Modul-Kopf
Funktion ist global verwendbar:
--> Deklaration als "extern" im Header und includen des Header in allen Modulen, die die Funktion verwenden und im Modul, das für die Funktion implementiert.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.