Avatar billede themepark Nybegynder
23. september 2005 - 02:15 Der er 8 kommentarer og
1 løsning

Erklæring af 2 funktioner der kalder hinanden

Jeg har 2 funktioner, der, hvis visse betingelser er opfyldt, hver især skal kalde den anden (og nej, det bliver ikke uendelig løkke, det er jeg sikker på).

Mit problem er så, at jeg får fejl når den første funktion kalder den anden, fordi den anden først bliver erklæret længere nede i koden.

F.eks.

void func1() {
  // Noget kode
  func2();
}

void func2() {
  // Noget kode
  func1();
}

Så får jeg følgende 2 fejlmeddelelser:

error: conflicting types for 'func2'
error: previous implicit declaration of 'func2' was here

Men hvordan løser jeg så det problem?
Avatar billede bertelbrander Novice
23. september 2005 - 02:17 #1
Du laver en prototype på func2, og skriver den inden func1:

void func2();
Avatar billede mookid8000 Nybegynder
23. september 2005 - 09:38 #2
jep... problemet er at når compileren render ind i kaldet til func2() oppe i func1() så går den ud fra at det er en function der returnerer en int... og da det ikke er tilladt at definere flere functioner med samme navn men med forskellige return-typer, så vil compileren brokke sig når den møder definitionen af func2.

Du bliver nødt til at lave en funktionserklæring oppe i toppen - generelt er det en god ide at gøre det til alle funktioner, også selvom dette problem ikke umiddelbart opstår... og så bør det gøres i en header-fil, så får du jo også mulighed for at kalde dine funktioner fra andre .c filer
Avatar billede themepark Nybegynder
23. september 2005 - 12:43 #3
Ja, det kunne da ikke blive mere enkelt.

Men hvad er den dybere mening så med funktionserklæringer? Det virker jo lidt som dobbeltkonfekt at erklære navn og returtype 2 steder. Men er det for at kunne bruge funktionerne fra andre C filer som nævnt?
Avatar billede mookid8000 Nybegynder
23. september 2005 - 15:30 #4
Tjaeh, den præcis grund er vel lidt svær at regne ud... og sprog som Java og C# har jo elimineret det trin, så det er da ikke helt umuligt at lave et programmeringssprog som ikke kræver funktionserklæringer.

Men der er nok alligevel en eller anden god grund til det. Der er jo nogle ting i C/C++-byggeprocessen som adskiller sig lidt fra de to førnævnte sprog.

Men umiddelbart, som programmør og Udøver Af God Kodestil, vil det jo være en god ide altid at lave en header-fil indeholdende erklæringer af samtlige funktioner i den tilhørende .c/.cpp-fil.
Avatar billede themepark Nybegynder
23. september 2005 - 19:06 #5
Hmm okay :) Jeg læste også lidt om det, og forstår det egentlig bedre nu. Så smid et svar begge to, så er der point :)
Avatar billede bertelbrander Novice
23. september 2005 - 20:13 #6
>mookid, at lave prototyper for ALLE funktioner i header filer er nok ikke nogen god idé, der findes static functioner der kun skal kunne kaldes fra samme c/cpp fil.

I C++ (men ikke C) skal kompileren kunne se hvordan funktioner den vil kalde ser ud. Så enten skal man have funktionen før man kalder den, eller man skal have en prototype.
Avatar billede mookid8000 Nybegynder
24. september 2005 - 13:19 #7
>bertelbrander, i C skal compileren også se det, ellers går den jo ud fra at funktionen returnerer en int - og det kan give rimelig mystiske resultater når man så f.eks. laver en funktion der returnerer en float, for så bliver denne float jo casted til int, re-interpret style
Avatar billede mookid8000 Nybegynder
24. september 2005 - 13:24 #8
og så lige en lille kommentar til det med static - der er jo to betydninger af static...

Det er klart at hvis en "fri" funktion er erklæret static, sådan at den kun kan kaldes fra den samme .c/.cpp-fil som den er defineret i, så vil man nok ikke lave en header-fil som skal kunne inkluderes alle vegne

Derimod når static er til statiske funktioner og data i en struct eller klasse så vil en header-fil jo nok altid være en rigtig god ide
Avatar billede bertelbrander Novice
24. september 2005 - 16:03 #9
I C SKAL man ikke have en prototype, men ja, det kan give sære resultater hvis man ikke har det.

Med static functioner mente jeg static ikke member funktioner.

På samme måde som man ikke erklærer class'er og struct's i headerfiler medmindre at de skal bruges af mere end én cpp fil, erklærer (dvs laver prototyper) man ikke funktioner i header filer. Det samme gælder variabler og andre typer.
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