#include..



  • Hallo,
    ich versuche folgendes.

    #include <PIC18fxx8.h>;
    #include "mult.h";
    main()
    {
    while (1)
    {
    c = mult(10,10);
    }
    }

    /////// *Hier die header datei mult.h* ///////

    unsigned int mult(unsigned char a,unsigned char b)
    unsigned int c;
    {
    unsigned int result;
    result = a*b;
    return result;
    }

    Ich habe die Variable c in mult.h declariert, der compiler meldet das die variable c undefiniert ist.
    Wie kann man so etwas machen.

    Gruß
    Johann



  • unsigned int mult(unsigned char a,unsigned char b) 
    
    { 
    	unsigned int result; 
    	result = a*b; 
    	return result; 
    } 
    
    int main() 
    {        unsigned int c; 
    	while (1) 
    	{ 
    	   c = mult(10,10); 
    	} 
    }
    

    sieht nach einem alten buch aus...
    nimm die semikolons hinter includes weg.
    präprozessoranweisungen werden nicht mit semikolon abgeschlossen.

    funktionsfefintionen gehören nicht in einen header..



  • elise schrieb:

    [code]
    unsigned int mult(unsigned char a,unsigned char b)

    {
    unsigned int result;
    result = a*b;
    return result;
    }

    int main()
    { unsigned int c;
    while (1)
    {
    c = mult(10,10);
    }
    }

    sieht nach einem alten buch aus...
    nimm die semikolons hinter includes weg.
    präprozessoranweisungen werden nicht mit semikolon abgeschlossen.

    funktionsfefintionen gehören nicht in einen header..

    Ich habe vorher nur Assembler programmiert und progammiere nun Microcontroller
    in C (stehe erst am Anfang). Also der Compiler meldet keinen Fehler wegen des Semikolons, sonder er findet die Variable c nicht und warum gehören Funktionsdefinitionen nicht in einen header? wohin sonst? und warum ist die
    Variable c nicht definert?



  • hermes schrieb:

    Ich habe vorher nur Assembler programmiert und progammiere nun Microcontroller
    in C (stehe erst am Anfang). Also der Compiler meldet keinen Fehler wegen des Semikolons, sonder er findet die Variable c nicht und warum gehören Funktionsdefinitionen nicht in einen header? wohin sonst? und warum ist die
    Variable c nicht definert?

    1. Warum er das Semikolon nicht anmeckert ... keine Ahnung. Ist jedenfalls laut dem C-Standard falsch.
    2. Es gibt keine Deklaration der Variablen c. Das was bei dir als "unsigned int c;" steht, ist falsch, aber dein Compiler meckert es nicht an. Kann passieren, µC-Compiler sind vielleicht nicht so der Hit.
    3. Definitionen gehören in .c-Dateien, Deklarationen in .h-Dateien. Die verschiedenen .c-Files werden getrennt übersetzt und zum Schluss vom Linker zusammengebunden (sollte dir als Assemblerprogrammierer evtl. ein Begriff sein.)



  • Bashar schrieb:

    hermes schrieb:

    Ich habe vorher nur Assembler programmiert und progammiere nun Microcontroller
    in C (stehe erst am Anfang). Also der Compiler meldet keinen Fehler wegen des Semikolons, sonder er findet die Variable c nicht und warum gehören Funktionsdefinitionen nicht in einen header? wohin sonst? und warum ist die
    Variable c nicht definert?

    1. Warum er das Semikolon nicht anmeckert ... keine Ahnung. Ist jedenfalls laut dem C-Standard falsch.
    2. Es gibt keine Deklaration der Variablen c. Das was bei dir als "unsigned int c;" steht, ist falsch, aber dein Compiler meckert es nicht an. Kann passieren, µC-Compiler sind vielleicht nicht so der Hit.
    3. Definitionen gehören in .c-Dateien, Deklarationen in .h-Dateien. Die verschiedenen .c-Files werden getrennt übersetzt und zum Schluss vom Linker zusammengebunden (sollte dir als Assemblerprogrammierer evtl. ein Begriff sein.)

    Also wenn ich dich richtig verstehe, muss ich denn Code dei Funktion als
    .c includen und die declaration der variable c in einer header Datei?Hä?

    Habe beim assembler programmieren soetwas schon gemacht (borland Tasm),
    konnte ohne probleme asm programme includen.

    ////////////////////////////////////////////////////////////
    ;**************************************************
    ;* ROUTINE SCHREIBT DIE BILDSCHIRMMASKE *
    ;* šBERGABE: *
    ;* KEINE *
    ;* RšCKGABE: *
    ;* KEINE *
    ;**************************************************
    draw_mask PROC USES BX
    mov ax,-1
    call set_cursor
    mov si,OFFSET mask
    mov dx,0
    mov bh,17h
    next_line:
    mov ah,bh
    call draw_string
    mov bh,17h
    inc dh
    search_end:
    lodsb
    cmp al,0
    jne search_end
    cmp byte ptr ds:[si],0
    je mask_draw
    cmp byte ptr ds:[si],0ffh
    jne no_other_color
    mov bh,1ah
    lodsb
    no_other_color:
    jmp next_line
    mask_draw:
    ret
    draw_mask ENDP // Ende des asm Programms, vorher wesentlich mehr

    // Hier include ich die Unterroutinen kann in jedem asm Prog wiederverwendet
    werden
    include include\marconi.inc // Die inc Datei enthält Routinen sowie die dazu
    // gehörigen Variablen.

    end start



  • In C muessen Funktionen, bevor du diese benutzt, bekannt sein. Daher includierst
    du die entsprechenden Header mit den Funktionsprototypen der Funktionen, welche
    du nutzen willst, am Anfang deiner Implementationsdatei.

    Z. B hast du folgendes:

    //header datei
    #ifndef testH
    #define testH //vor mehrfachincludierung schuetzen
    
    double mal2(double zahl); //funktionsprototyp der funktion mal2
    
    #endif
    
    //implementationsdatei test.c
    #include "test.h"
    
    double mal2(double zahl)
    {
       return zahl * 2;
    }
    
    //hauptprogramm
    //mal2 soll hier aufgerufen werden, also muss die funktion bekannt sein
    #include "test.h"
    //sonstige includes
    
    int main()
    {
       //irgendwas...
          zahl = mal2(zahl); //aufruf der funktion
       //irgendwas...
       return 0;
    }
    

    Beim gcc bspw. wuerde man jetzt das ganze so uebersetzen:

    gcc -o testprogramm test.c main.c

    Die beiden Implementationsdateien test.c und main.c werden uebersetzt und
    dann vom Linker zusammengefuehrt.

    Hoffe ich konnte ein wenig helfen.

    mfg
    v R



  • virtuell Realisticer schrieb:

    In C muessen Funktionen, bevor du diese benutzt, bekannt sein. Daher includierst
    du die entsprechenden Header mit den Funktionsprototypen der Funktionen, welche
    du nutzen willst, am Anfang deiner Implementationsdatei.

    Z. B hast du folgendes:

    //header datei
    #ifndef testH
    #define testH //vor mehrfachincludierung schuetzen
    
    double mal2(double zahl); //funktionsprototyp der funktion mal2
    
    #endif
    
    //implementationsdatei test.c
    #include "test.h"
    
    double mal2(double zahl)
    {
       return zahl * 2;
    }
    
    //hauptprogramm
    //mal2 soll hier aufgerufen werden, also muss die funktion bekannt sein
    #include "test.h"
    //sonstige includes
    
    int main()
    {
       //irgendwas...
          zahl = mal2(zahl); //aufruf der funktion
       //irgendwas...
       return 0;
    }
    

    Beim gcc bspw. wuerde man jetzt das ganze so uebersetzen:

    gcc -o testprogramm test.c main.c

    Die beiden Implementationsdateien test.c und main.c werden uebersetzt und
    dann vom Linker zusammengefuehrt.

    Hoffe ich konnte ein wenig helfen.

    mfg
    v R

    Kann ich Dir folgen,

    In der Datei Test.h steht:
    //header datei
    #ifndef testH
    #define testH //vor mehrfachincludierung schuetzen
    double mal2(double zahl); //funktionsprototyp der funktion mal2
    #endif

    was ist die Implementationsdatei test.c
    Neue Datei test.c?
    //implementationsdatei test.c
    #include "test.h"
    double mal2(double zahl)
    {
    return zahl * 2;
    }
    Heist diese Datei test.c
    oder steht das ganze noch in test.h?

    Also ich ich erstelle eine test.h Datei wo ich die Funktion mal2 declariere,
    anschließend erstelle ich eine .c datei wo der eigentliche Code der
    Funktion mal2 steht, anschließend include ich die datei test.h in mein
    Hauptprogramm?
    Kann ich auch eine Variable "c" in der datei test.h declarieren?
    Ist das nicht ein bischen umständlich?

    Ich möchte "einfach nur folgendes" ich habe für einen Microcontroller
    eine Funktion (ds_1307) zum auslesen einer Echtzeituhr über die I2C Schnittstelle programmiert. Diese funktion schreibt die Zeit,das Datum
    in einen globalen string time_date.
    Ich möchte nun mit einem Include die Funktion ds_1307 inclusive den String
    time_date includen.
    Gruß
    Johann



  • Ein #include <stdio.h>; ist laut Stanard vollkommen richtig, weil der Präprozessorg
    das #include liest und die Klammern, dafür setzt er den Header ein und danach
    steht da ja der Code aus dem header und eine leere Anweisung ( ; )
    => daher kein Fehler



  • => daher kein Fehler

    Bei mir gibts auf jeden Fall ne Warnung. Fakt ist: Es hat keine Vorteile und bringt ne Warnung, von daher seh ich den Sinn nicht, das Semikolon dahinzusetzen.



  • Ne leere Anweisung ist im Regelfalle nicht gewollt/beabsichtigt, daher ist ne
    Warnung doch absolut gerechtfertigt, oder 🙂



  • gcc lässt es nicht zu:
    prep.c:1: `#include' expects "FILENAME" or <FILENAME>

    Ist auch ganz klar. Die Preprozessor-Anweisungen unterliegen nicht der normalen Grammatik von C und nehmen jeweils die ganze Zeile ein.



  • @hermes
    Die zwei Funktionen hast du dann sicher schon in einer .c-Datei. Jetzt musst du nur noch die Deklarationen deiner Funktionen und die Includes in deiner .c-Datei in eine entsprechende .h-Datei legen. Die .h-Datei includierst du in der .c-Datei und in den .c-Dateien, die die Funktionen benutzen sollen. Wenn du eine IDE hast mit einer Projektverwaltung, dann solltest du die .c-Datei mit den zwei Funktionen den Projektdateien hinzufügen, wenn du die .c-Dateien per Hand dem Compiler angeben musst, dann darfst du die .c-Datei mit den zwei Funktionen nicht vergessen, sonst meckert der Linker.



  • AJ schrieb:

    @hermes
    Die zwei Funktionen hast du dann sicher schon in einer .c-Datei. Jetzt musst du nur noch die Deklarationen deiner Funktionen und die Includes in deiner .c-Datei in eine entsprechende .h-Datei legen. Die .h-Datei includierst du in der .c-Datei und in den .c-Dateien, die die Funktionen benutzen sollen. Wenn du eine IDE hast mit einer Projektverwaltung, dann solltest du die .c-Datei mit den zwei Funktionen den Projektdateien hinzufügen, wenn du die .c-Dateien per Hand dem Compiler angeben musst, dann darfst du die .c-Datei mit den zwei Funktionen nicht vergessen, sonst meckert der Linker.

    ;

    Die header datei math.h

    extern double floor(double);
    extern double ceil(double);
    extern double modf(double, double *);
    extern double sqrt(double);
    extern double atof(const char *);
    extern double sin(double);
    extern double cos(double);
    extern double tan(double);
    extern double asin(double);
    extern double acos(double);
    extern double atan(double);
    extern double atan2(double, double);
    extern double frexp(double, int *);
    extern double ldexp(double, int);
    extern double log(double);
    extern double log10(double);
    extern double pow(double, double);
    extern double exp(double);
    extern double sinh(double);
    extern double cosh(double);
    extern double tanh(double);
    extern double eval_poly(double, const double *, int);

    Wo stehen den die eigentlichen Funktionen??



  • Die werden in der Standard-C Library mitgeliefert. Den Quellcode dazu hast du
    nicht, es sei denn du verwendest den gcc. Dort wird der Quellcode mitgeliefert,
    wenn du dir nicht nur die Binarys installiert hast.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Die werden in der Standard-C Library mitgeliefert. Den Quellcode dazu hast du
    nicht, es sei denn du verwendest den gcc. Dort wird der Quellcode mitgeliefert,
    wenn du dir nicht nur die Binarys installiert hast.

    mfg
    v R

    Und wie nennt sich so eine Library?

    Gruß
    Johann



  • Schau mal hier: http://www.gnu.org/directory/libs/c/glibc.html

    Aber eigentlich braucht dich die Implementierung der C-Library ja nicht zu
    interessieren, du nutzt sie ja nur 🙂

    mfg
    v R


Anmelden zum Antworten