#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 RKann 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
#endifwas 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 RUnd 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 nurmfg
v R