Avatar billede trp79 Nybegynder
15. september 2002 - 14:35 Der 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?
Avatar billede jespernaur Nybegynder
15. september 2002 - 14:44 #1
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.
Avatar billede trp79 Nybegynder
15. september 2002 - 17:52 #2
Jeg bruger linux og dens cc-compiler. Jeg er ikke helt med på hvad du mener. For nu at tage et eks. En fil med en funktion kunne se sådan ud:

#include <stdio.h>
test()
{
printf("Funker\n");
}

Derefter compiler jeg den så med hvilen komando?

Og hvordan gør jeg brug af funktionen test fra en anden fil?
Avatar billede mbulow Nybegynder
15. september 2002 - 18:35 #3
Din headerfil kan du lave ved at ændre din fil (den fra eksemplet) til at se sådan her ud (Jeg kalder lige din fil hejsa.c):

hejsa.c:
--------
#include "hejsa.h"    //Den her linjer er eneste ændring
#include <stdio.h>

test()
{
printf("Funker\n");
}



Den tilsvarende headerfil kan så se således ud:

hejsa.h:
--------
#ifndef HEJSA_H__INCLUDED
#define HEJSA_H__INCLUDED

test();

#endif  //HEJSA_H__INCLUDED


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 :)
Avatar billede trp79 Nybegynder
15. september 2002 - 21:14 #4
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?
Avatar billede trp79 Nybegynder
15. september 2002 - 21:18 #5
jeg er ret meget newbie :o(
Avatar billede mbulow Nybegynder
15. september 2002 - 22:05 #6
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>

int add(int a, int b){
  return a + b;
}

void show(int a){
  printf("%d\n", a);
}
//--- funks.h slutter her ---



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
Avatar billede mbulow Nybegynder
15. september 2002 - 22:12 #7
==> jeg er ret meget newbie :o(

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...????
Avatar billede trp79 Nybegynder
15. september 2002 - 22:24 #8
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.
Avatar billede mbulow Nybegynder
15. september 2002 - 22:47 #9
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 :)
Avatar billede trp79 Nybegynder
15. september 2002 - 22:56 #10
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(
Avatar billede trp79 Nybegynder
15. september 2002 - 23:05 #11
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"
Avatar billede trp79 Nybegynder
15. september 2002 - 23:05 #12
hvad kan det være?
Avatar billede trp79 Nybegynder
15. september 2002 - 23:15 #13
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)
Avatar billede mbulow Nybegynder
15. september 2002 - 23:34 #14
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 :)
Avatar billede trp79 Nybegynder
16. september 2002 - 11:17 #15
Jep det funkerer perfekt nu! Du får tak :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester