PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compilermeldungen?



Henry
31.03.2007, 17:10
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

Henry
31.03.2007, 17:52
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

geronet
31.03.2007, 18:05
Vielleicht zeigst du mal die Zeile und die eigentliche Funktion?

Henry
31.03.2007, 18:13
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.

Henry
31.03.2007, 19:12
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

Henry
01.04.2007, 01:09
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

Felix G
01.04.2007, 02:05
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 ...
}

p_mork
01.04.2007, 11:07
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.

p_mork
01.04.2007, 12:59
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

kater
01.04.2007, 13:18
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.

p_mork
01.04.2007, 13:26
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

Henry
01.04.2007, 23:04
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.