- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Compilermeldungen?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317

    Compilermeldungen?

    Anzeige

    E-Bike
    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:
    Code:
    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?
    mfG Henry

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    33
    Beiträge
    344
    hi,
    also die zweite meldung sagt das du in einer eingebundenen datei am ende der datei keine neue zeile hast.

    MfG Martin

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.01.2007
    Beiträge
    134
    Vielleicht zeigst du mal die Zeile und die eigentliche Funktion?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    Hallo,

    kein Problem.

    der Aufruf in main() sieht so aus
    Code:
     void init_digital();         // Ports initialisieren (eigene Funktion)
     void init_timer();           // Timer initialisieren (eigene Funktion)
    und die Funktionen so:
    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
    }
    Code:
    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.
    mfG Henry

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    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:
    Code:
    void init_digital(void);
    Danke für eure Hilfe, das Problem ist damit gelöst
    mfG Henry

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    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
    Code:
    warning: function declaration isn't a prototype
    Danke
    mfG Henry

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    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!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    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.:
    Code:
    #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/in...ial#Prototypen

    MfG Mark

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Henry
    Könnte mir da doch noch jemand einen Tip geben was da der Fehler sein könnte wenn die Compilerwarnung kommt...
    Code:
    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:
    Code:
    //Prototyp (im Header/Kopf der C-Quelle
    extern void foo (void);
    //oder 
    static void foo (void);
    
    // Implementierung
    void foo (void)
    {
       ...
    }
    
    // Aufruf
    ...
    {
       foo();
    }
    Zitat Zitat von p_mork
    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.
    Disclaimer: none. Sue me.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests