Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

Funktioner i C

Har en till synes enkel uppgift i C.
Detta är givet:

#include <stdio.h> ... add-funktionens deklaration in här ... int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); printf("Summan är %d\n", result); return 0; } ... add-funktionens definition in här ...

Man ska lägga in add-funktionens deklaration och defintion från föreläsningen som är:

int add(int n, int m);

samt:

add(n,m);

Så jag lägger in dem i funktionen enligt instruktion:

#include <stdio.h> #include <math.h> int add(int n, int m); int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); return number1 + number2; printf("Summan är %d\n", result); return 0; } add(n, m);

Vilket inte fungerar, utan ger fel på raden med "result = add(number1, number2);
med felmeddelandet " undefined reference to `add' "
Vad gör jag för fel?

Har även provat att göra enligt följande vilket inte heller funkar.

#include <stdio.h> #include <math.h> int add(int number1, int number2); int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); return number1 + number2; printf("Summan är %d\n", result); return 0; } add(number1, number2);

Med samma resultat.

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004

@Litenskit

Du har inte skapat funktionen du försöker kalla på.
https://www.tutorialspoint.com/cprogramming/c_functions.htm

Trädvy Permalänk
Medlem
Registrerad
Apr 2002

Funktionsnamnet "add" är inget som finns som standard utan en helt vanlig funktion som du behöver definiera själv. Att deklarera något innebär att låta efterföljande kod känna till att funktionen finns. Att definiera en funktion innebär att implementera det ställe i koden där du ska hamna när funktionen anropas.
Att bygga ihop ett exekverbart program kan förenklat delas in i två steg: först kompilering, sist länkning. Kompileringen är att översätta varje källkodsfil till en objektfil bestående av maskinkod. Länkningen är att koppla ihop en eller flera objektfiler och en entrypoint med varandra så att det blir något som går att exekvera.
I det första steget, kompileringen, räcker det med att känna till funktioners signatur, dvs funktionen måste vara deklarerad. I länkningen behöver funktionens implementation finnas med, dvs den måste vara definierad. Kompilering och länkning görs egentligen av olika program, men de flesta kompilatorer "döljer" länkningen som att det skulle ingå i samma steg.
Med det sagt, deklarationen av din funktion ser ut så här:

int add(int number1, int number2);

En matchande definition ser då ut så här:

int add(int number1, int number2) { return number1 + number2; }

I enkla fall går det bra att skippa deklarationssteget och definiera direkt, men i större projekt när man använder sig av funktioner från andra headerfiler så undviker man det eftersom det innebär att man eventuellt kompilerar samma kod flera gånger om, vilket kostar onödig kompileringstid.

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

Nu ser min kod ut enligt följande:

#include <stdio.h> int add(int n, int m) { int result; result = n + m; return result; } int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); printf("Summan är %d\n", result); return 0; }

Den fungerar enligt förväntan och skriver ut 579 men jag förstår fortfarande inte vad jag ska skriva längst ner efter måsvingen där det står "... add-funktionens definition in här ..." i första inlägget, samt varför ska jag göra det när det fungerar?

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Registrerad
Apr 2002
Skrivet av Litenskit:

Nu ser min kod ut enligt följande:

#include <stdio.h> int add(int n, int m) { int result; result = n + m; return result; } int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); printf("Summan är %d\n", result); return 0; }

Den fungerar enligt förväntan och skriver ut 579 men jag förstår fortfarande inte vad jag ska skriva längst ner efter måsvingen där det står "... add-funktionens definition in här ..." i första inlägget, samt varför ska jag göra det när det fungerar?

Läs det sista stycket i mitt förra inlägg. Nu har du skippat deklarationen och definierat direkt. Det funkar kanske bra i just det här fallet, men ponera att du har två funktioner som anropar varandra:

int addAlpha(int num, bool other) { if (other) return addBeta(num, false); else return num + 3; } int addBeta(int num, bool other) { if (other) return addAlpha(num, false); else return num + 4; }

Om du försöker kompilera det där kommer du få ett error. C-kompilatorn tittar inte igenom filen i förväg inför kompilering, så när addAlpha ska kompileras så kommer anropet till addBeta ge ett error, eftersom addBeta i det läget inte är deklarerad. Att byta ordning på funktionerna skulle ge motsvarande fel: du får error i addBeta eftersom addAlpha då inte är deklarerad.
För att komma runt detta problem deklarerar du funktionen först:

int addBeta(int num, bool other); int addAlpha(int num, bool other) { if (other) return addBeta(num, false); else return num + 3; } int addBeta(int num, bool other) { if (other) return addAlpha(num, false); else return num + 4; }

Tada! nu går det att kompilera utan problem.

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

@deppan:

Nu ser min code ut såhär:

#include <stdio.h> int add(int n, int m); int main(void) { int number1 = 123; int number2 = 456; int result; result = add(number1, number2); printf("Summan är %d\n", result); return 0; } int add(int n, int m) { return n + m; }

Har jag förstått rätt nu med att deklarera och definera på olika platser?

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Registrerad
Apr 2002
Skrivet av Litenskit:

Har jag förstått rätt nu med att deklarera och definera på olika platser?

Jajjemän!

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

@deppan: Grejt! Tack som fan för hjälpen Det lär dock komma mer

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

@deppan:

Nu har jag stött på problem, igen...

Med följande funktion kan du skriva ut innehållet i en array av heltal i bakvänd ordning.

void printArray(int n, int arr[]) { /* Basfall */ if (n == 1) { printf("%d ", arr[0]); } /* Rekursivt fall */ else { printArray((n – 1), arr); printf("%d ", arr[n - 1]); } }

Det vill säga, om en array arr innehåller följande tal, {1, 2, 3, 4, 5, 6, 7} skrivs de ut på
följande sätt:
7 6 5 4 3 2 1
Din uppgift är att skriva en ny funktion genom att ändra i den givna funktionen så att talen skrivs ut
framifrån. Det vill säga:
1 2 3 4 5 6 7
Skriv även en main-funktion där du kan testa din uppdaterade funktion

Jag skrev en funktion, som inte fungerade med konstiga fel var på jag tittade på lösningsförslaget och såg att jag hade gjort likadant som på den (med undantag för namngivning). Så jag gjorde så att jag kopierade lösningsförslaget för att testa det... Vilket inte heller funkade med samma fel...

Här är det:

#include <stdio.h> void printArray(int n, int arr[]); int main(void) { const int n = 7; int a[] = {1, 2, 3, 4, 5, 6, 7}; printArray(n, a); printf("\n"); return 0; } void printArray(int n, int arr[]) { /* Basfall */ if (n == 1) { printf("%d ", arr[0]); } /* Rekursivt fall */ else { printArray((n – 1), arr); printf("%d ", arr[n - 1]); } }

Med dessa fel:

*sökväg*/f11/main.c:17:3: error: stray '\342' in program *sökväg*/f11/main.c:17:3: error: stray '\200' in program *sökväg*/f11/main.c:17:3: error: stray '\223' in program *sökväg*/f11/main.c:17:21: error: expected ')' before numeric constant printArray((n – 1), arr); ^

Vad ska jag göra?

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Plats
~/
Registrerad
Apr 2007

Ditt felmeddelande klagar på att du har använt ett tankesträck snarare än ett minustecken, jämför – och -. Du borde fundera på när du ska göra rekursionsanropet (om du vill skriva ut i bakvänd ordning) samt vad som händer om du ger funktionen en tom array (är verkligen n==1 det bästa basfallet?)

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

@Ambit:

Åhh vad irriterande fel, klipp och klistra funkar inte så bra.
Det var givet från uppgiften en funktion som skrev ut arrayen baklänges, den skulle skrivas om så den skrev ut arrayen rätt väg.

Tack för hjälpen, ska kika på dina kommentarer.

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Trädvy Permalänk
Medlem
Plats
Malmfälten
Registrerad
Mar 2008

@Ambit:

Exakt du det du skrev om basfallet var nästa uppgift. Kan nästan tro att du har gjort dessa uppgifter;)

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.