15. september 2002 - 14:35Der er
14 kommentarer og 1 løsning
Header filer
Hejsa.. Jeg har nu lavet en compile-klar fil som kun indeholder nogle funktioner. Hvordan laver jeg denne til en header fil? og bruger jeg bagefter bare funktionerne i filen ved: #include <myheader.h> og derefter blot taste navn på funktioner?
Du er selv nødt til at skrive det der skal stå i .h filen - og i egen interesse bør du #include .h filen også fra den fil, der indeholder funktionerne. Dermed opnår du, at oversætteren kontrollerer, at det der står i .h filen svarer til den faktiske implementation.
De ekstralinjer jeg har indsat i header-filen (#ifndef, #define, #endif) er et lille trick til at undgå fejl hvis man får inkluderet header-filen flere gange. Det kan være ret umuligt at undgå denne situation, så det er en god ide altid at indramme sine header-filer med de 3 linjer.
Det du nu gør for at kunne bruge din funktion i en anden fil, er at inkludere den ved øverst i filen at skrive: #include "hejsa.h" Så får du adgang til funktionen :)
Okey, det forstår jeg ikke (og kan jeg ikke få til at virke:o( ). Som jeg umiddelbart kan læse så skal "der to filer til at lave en header fil" + den fil hvorfra man kalde en funktion som man har i header filen. Men ovenover kalder du begge eksempler for header filer. Og i den der hedder hejsa.h er der blot et funktionskald til test(), og ikke rigtig nogen henvisning til hejsa.c hvor funktionen egentlig ligger! Noget andet er... hvad med compiling? skal de alle compileres? og med hvilke commandoer?
Hehe... Ja OK... Jeg indrømmer at jeg ikke altid er lige god til at forklare ting :) men så lad mig vise dig hvordan det kan gøres med et lille eksempel. Kan jo være det er mere effektivt en endnu et forsøg på en forklaring
Ordforklaring: -------------- sourcefil => Selve filen med funktionerne. Typisk en .c-fil headerfil => Indeholder funktionernes deklarationer. Typisk en .h-fil
Eksemplet: ---------- Først laver vi en source-fil med to funktioner, lad os kalde den funks.c (Det her kunne være din egen fil med dine funktioner)
//--- funks.c starter her --- #include "funks.h" //Husk den her, så source inkluderer header #include <stdio.h>
Så laver vi en tilsvarende headerfil der hedder det samme, men med endelsen h (Altså funks.h)
//--- funks.h starter her --- #ifndef FUNKS_H__INCLUDED #define FUNKS_H__INCLUDED
int add(int a, int b); void show(int a);
#endif //FUNKS_H__INCLUDED //--- funks.h slutter her ---
Til sidst laver vi så lige endnu en fil med main()-funktionen, bare for at vise et fungerende eksempel :)
//--- testen.c starter her --- #include "funks.h"
int main(){ int x; x = add(1, 2); show(x); return 0; } //--- testen.c slutter her ---
Hvis du stadig ikke kan få det til at virke, så prøv at poste ALT din kode her, så kan jeg kigge den igennem... Kan være det er nemmere på den måde så
PS! Jeg tror egentlig godt jeg kan se hvor det er gået galt i sidste indlæg, fra min side :) Den første sætning hvor jeg snakker om at ændre din egen fil, kunne meget nemt misforstås som om jeg kalder både .c og .h-filen for HEADERFILER :) Sorry about that
Ja hva' faen, det er vi vel alle sammen på et tidspunkt... Og dessuden skulle jeg ud fra dit sidste spørgsmål mene at du måske bare er begynder i C, men kan et andet programmeringssprog... F.eks. Java ;)
Det er rimeligt hårdt hvis en lærer sætter en til at løse multiprocess-opgaver i C med fork() og sleep() hvis du var helt ny til programmering.
(Faktisk kunne jeg være så fræk at tro du var fra RUC... Opgaven og tidspunktet mindede egentlig meget om noget jeg har set før i starten af et "Distribuerede systemer"-kursus :) hehehe)
BTW: Angående hvilke kommandoer der skal bruges for at kompilere... Hvilket system bruger du? Windows, Linux, Unix, eller...????
Hehe... ja jeg kender lidt til java :o) Jeg læser dog ikke på RUC men på Handelshøjskolen i kbh, hvor den står på ha(dat.)
Ups, ja det er "måske" en ide at skrive noget om hvilen compiler og OS jeg bruger... det er Linux, jeg compiliere fra shellen og bruger altså cc (gcc). Så ja, hvordan skal sourcefil og headerfil compileres? Vil du ikke give respons med et svar istedet for en kommentar så jeg kan accepterer dit svar.
Hups :) Min første kommentar skulle sådan set ha' været et svar... Nå ja sådan kan det jo gå
Jeg har lige siddet og leget lidt med cc på en linux server, og det jeg fandt som den nemmeste måde at kompilere mit tidligere eksempel (Den med funks.c, funks.h og testen.c) er sådan her:
Saml alle de filer der skal kompileres i en mappe (lad os kalde den 'sourcecode'). Skift til den mappe. Skriv: cc *.c
Så tygger den sig gennem alle *.c filerne og giver dig et program, hvis ikke der er "klumper i sovsen" (fejl i sourcen) :) Sorry kunne ikke lade være :) lol
PS! Hvis du har husket dine #include's skal kompileren nok selv sørge for at inkludere .h-filerne i de .c-filer der har brug for dem, før den kompilerer. Så du skal bare kompilere .c-filerne så kører det :)
Jeg går udfra du mener cc -o *.c ? Jeg prøvede først med "cc *.c" men fik så "Ingen sådan fil eller filkatalog", bagefter gjorde jeg det så med "cc -o *.c" in function main: undefined reference to add, undefined reference to show :o(
wierd... jeg prøvede lige igen, og kunne denne gang godt compile! Den laver så en a.out, men når jeg kører denne(./a) skriver den "ingen sådan fil eller filkatalog"
umddelbart ville jeg selv tro det var fordi den ikke kunne finde h-filen... men det er stavet rigtigt osv... men der er vel "nogle klumper i sovsen" som compileren ikke kan se... kunne den have set hvis jeg var kommet til at stave forkert der hvor h filen includes? Du får mange tak for al hjælpen :o) Det er vist ved at være tid til at knalde brikker... takker :o)
Nej nej hvis du får en a.out, skulle det være kompileret (og linket) uden fejl.
a.out er selve programmet, kald det ved at skrive
./a.out
Du havde vist lige glemt .out :)
Stavet navnet på en headerfil forkert: Ja det burde den da absolut melde fejl på, hvis det altså ikke er så grunding en stavebøf at der findes en anden fil med det formkerte navn :)
Selve kompileringen:
cc *.c Så kompilerer den .c-filerne, linker, og gemmer det endelige program i en fil kaldet a.out
cc -o hej *.c Samme som ovenover men kalder nu filen hej i stedet for a.out
Men siden du har fået en a.out fil vil jeg gå ud fra du har fået det til at lykkedes helt fint :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.