Hur gör man och exekverar funktioner i C++ ?

Permalänk

Hur gör man och exekverar funktioner i C++ ?

Har försök att lista ut detta i ett tag, och jag har faktiskt använt det så kallade Google för att lösa detta problem. Dock utan resultat.

Frågan är i alla fall: Vad sparar jag min egengjorda funktion som, och hur exekverar och inkluderar jag den i ett program?

Funktionen jag har gjort ser ut som följande

{ ff(a>b) return a; // Här skulle man kunna ha en else, men det behövs inte return b; }

Tack i förväg!

Visa signatur

Chassi: Fractal design r2 PSU: 850W CPU: Intel I5-2500k @ 3,3Ghz GPU: Asus GeForce GTX 560 RAM: Kingston 8Gb DDR3 1600Mhz, HDD: 1TB OS: Win7

Permalänk
99:e percentilen

Så kan man göra:

int largestOf(int a, int b) { if (a > b) { return a; } return b; } int myValue = largestOf(5, 12); // myValue är nu 12

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Skrivet av HurMycket:

Så kan man göra:

int largestOf(int a, int b) { if (a > b) { return a; } return b; } int myValue = largestOf(5, 12); // myValue är nu 12

Men är man verkligen tvungen att skriva in hela funktionen när man skapar ett nytt program?

Visa signatur

Chassi: Fractal design r2 PSU: 850W CPU: Intel I5-2500k @ 3,3Ghz GPU: Asus GeForce GTX 560 RAM: Kingston 8Gb DDR3 1600Mhz, HDD: 1TB OS: Win7

Permalänk
Medlem
Skrivet av wilhelmblomgren:

Men är man verkligen tvungen att skriva in hela funktionen när man skapar ett nytt program?

Om du skapar en eller flera funktioner som du vill kunna återanvända i olika andra så lägger du dessa funktioner i en fil som du exempelvis döper till "minafunktioner.cpp". Sedan är det bara att kopiera över "minafunktioner.cpp" till projektet du ska använda dessa funktioner. Hur exakt du går tillväga beror givetvis på vilken utvecklingsmiljö du sitter i.

Det enda en utvecklingsmiljö som exempelvis Microsoft Visual Studio gör, förutom att skapa en del konfigurationsfiler som är specifika för dina projekt, är att skapa helt enkla vanliga textfiler med filändelserna .cpp och .h där din källkod finns, som du kan kopiera runt, återanvända, och göra precis vad du vill med. Det är bara det att om du vill att dem ska bli en del av projektet i denna utvecklingsmiljö så måste du givetvis lägga till dem till projektet för att dem ska kompileras tillsammans med resten av koden i projektet.

Permalänk
Medlem
Skrivet av wilhelmblomgren:

Men är man verkligen tvungen att skriva in hela funktionen när man skapar ett nytt program?

Det finns olika svar till denna frågan, som suzieq säger så kan man skapa en fil med grundläggande funktioner. Eller t.om. ett ramverk som man kan använda vidare.

Men om du menar själva anropet till funktionen så är anonyma funktioner ett alternativ, c++11 har stöd för detta om jag inte misstar mig.

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk

Så här?

#include <iostream> #include <cstdlib> using namespace std; int main() { int Max (int a, int b); { ff(a>b) return a; return b; } int tal_1=11; int tal_2=8; int tal_3=8; int tal_4=14; int greatest= max(tal_1, tal_2); cout<<"greatest = "<<greatest<<endl; greatest = max(max(tal_2,tal_4),greatest); cout<<"greatest ="<<greatest<<endl; system("PAUSE"); return EXIT_SUCCESS; }

När jag fösöker exekvera programmet så får komplikatorn felmeddelande.

Visa signatur

Chassi: Fractal design r2 PSU: 850W CPU: Intel I5-2500k @ 3,3Ghz GPU: Asus GeForce GTX 560 RAM: Kingston 8Gb DDR3 1600Mhz, HDD: 1TB OS: Win7

Permalänk
99:e percentilen
Skrivet av wilhelmblomgren:

Så här?

#include <iostream> #include <cstdlib> using namespace std; int main() { int Max (int a, int b); { ff(a>b) return a; return b; } int tal_1=11; int tal_2=8; int tal_3=8; int tal_4=14; int greatest= max(tal_1, tal_2); cout<<"greatest = "<<greatest<<endl; greatest = max(max(tal_2,tal_4),greatest); cout<<"greatest ="<<greatest<<endl; system("PAUSE"); return EXIT_SUCCESS; }

När jag fösöker exekvera programmet så får komplikatorn felmeddelande.

Vilket felmeddelande visar kompilatorn och på vilken rad? (Kompilatorn ger dig oftast information som hjälper dig lösa problemet. Det är därför bra att lära sig tolka felmeddelanden.)

Jag har aldrig skrivit C++, men jag gissar att main inte ska vara en int? Och var noga med dina klamrar: int Max (int a, int b); betyder knappast något vettigt, utan det ska stå:

int Max (int a, int b) { int r; // bla bla return r; }

Följande stycke ser också malplacerat ut:

{ ff(a>b) return a; return b; }

En funktion i C++ är lite som en matematisk funktion f(x): Du ger den ett x och den ger något tillbaka, beroende på vad x är och hur funktionen är definierad. I C++ deklarerar du också vad f och x ska ha för typ. Om vi ska skriva funktionen f(x) = 2x + 5 i C++:

int f(int x) { return 2*x + 5; }

Denna funktion måste få en int som argument (x) och den returnerar alltid en int.

En skillnad mot matematiska funktioner är att en funktion i C++ kan vara av typen void. Det betyder att funktionen inte returnerar någonting:

void sayHello() { cout << "Hello"; }

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av HurMycket:

Jag har aldrig skrivit C++, men jag gissar att main inte ska vara en int?

Jo, main returnerar en int för status. Men detta är inte nödvändigt utan main kan även returnera typen void.

Sen har du (OP) massa fel i koden. Tror du menar if(a>b) istället för ff(a>b). Sen så har du försökt deklarera en metod inom main-metoden vilket inte går.

Såhär kan du ha det istället:

#include <iostream> #include <cstdlib> using namespace std; int max(int a, int b); int main() { int tal_1 = 11; int tal_2 = 8; int tal_3 = 8; int tal_4 = 14; int greatest = max(tal_1, tal_2); cout << "greatest = " << greatest << endl; greatest = max(max(tal_2, tal_4), greatest); cout << "greatest =" << greatest << endl; system("pause"); return EXIT_SUCCESS; } int max(int a, int b) { if(a>b) return a; return b; }

Dold text

Sen byt gärna ut

system("PAUSE");

mot

fgetc(stdin);

eller något liknande för att pausa programmet, system("PAUSE") fungerar endast på windows-maskiner.

Visa signatur

C>++

Permalänk
Medlem
Skrivet av Kreppe:

Det finns olika svar till denna frågan, som suzieq säger så kan man skapa en fil med grundläggande funktioner. Eller t.om. ett ramverk som man kan använda vidare.

Men om du menar själva anropet till funktionen så är anonyma funktioner ett alternativ, c++11 har stöd för detta om jag inte misstar mig.

c++11 har stöd för anonyma funktioner via lambda uttryck.

Lambda form:

[capture](parameters) -> return_type { function_body }

Exempel:

[](int x, int y) -> int { return x + y; }

Capture kan användas för att fånga variablers värden på olika sätt, via value eller via referens b.la.

se wiki för mer info gällande Lambda uttryck:
http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B

knappade ihop ett exempel på ovanstående kod:

auto lambda_func = [](int x, int y) -> int { return x > y ? x : y; }; cout << lambda_func(1, 2) << endl; cout << lambda_func(lambda_func(1,4), 2) << endl; fgetc(stdin);

Det går säkerligen att skriva lambda uttrycket bättre, låta det returnera en bool och fånga största värdet möjligtvis.

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk
Hedersmedlem
Skrivet av AnnoyingIB:

Men detta är inte nödvändigt utan main kan även returnera typen void.

Det är dock Fel™.

Skrivet av HurMycket:

int Max (int a, int b); betyder knappast något vettigt, utan det ska stå:

int Max (int a, int b) { int r; // bla bla return r; }

Skrivet av AnnoyingIB:

Sen så har du försökt deklarera en metod inom main-metoden vilket inte går.

Deklarationer (till skillnad från definitioner) är faktiskt tillåtna, så det skulle kunna vara vettigt om Max till exempel är definierad någon annanstans och man inte vill följa standardmönstret och inkludera header-filer. Nu kan man ju förvisso misstänka att avsikten ovan är att koden inom klamrarna skall höra till funktionshuvudet, men (förutom att det nog som sagt skall stå if) är koden giltig (om än lite udda).

Permalänk
Inaktiv

Din funktion skulle för bästa resultat kunna skrivas som en preprocessor macro (i kombination med ternary operations)

#define HIGHESTOF(x, y) ((x > y) ? x : y)

och du använder den såhär:

int a = 10; int b = 20; std::cout << HIGHESTOF(a,b) << std::endl; // Skriver ut "20"

Nu har jag inte testat detta så kan inte garantera att det fungerar (även aldrig kört ternarys i macros), men det bör funka.

Men för att svara på din egentliga fråga, hur definierar och använder man funktioner i C++ ?

Syntaxet är alltid detsamma:

typename funktionsnamn(argumentlista){ ... kod ... }

Där typename är vilken typ funkionen returnerar, funktionsnamn är namnet på funkionen, argumentlistan är en lista med argument som man skickar till funktionen (ett exempel är: int age, string name). Argumenten i argumentlistan består alltid av en typ(typename) följt av whitespace(typ mellanslag), följt av variabelnamnet för argumentet, och alla argument skiljs med komma tecken (,).

En väldigt simpel funktion kan se ut såhär:

bool IsOfLegalAge(int age){ if(age >= 18){ return true; }else{ return false; } }

och används såhär:

if(IsOfLegalAge(Cathy.GetAge())){ MakeIntercourse(Cathy); }

Med det sagt, funkionen du söker kan skrivas såhär:

int HighestOf(int x, int y){ if(x > y){ return x; }else{ return y; } }

och används såhär:

int a = 10; int b = 20; std::cout << HighestOf(a,b); // skriver ut 20

Extra: Förstå hur du kan göra din funktion oberoende av typ med templates. Skriver funktionen här, så kan du återbesöka denna posten om du vill ha hjälp att lära dig templates när du är redo:

template<typename T> T HighestOf(T a, T b){ return ((a > b) ? a : b); }

Permalänk
Datavetare
Skrivet av Elgot:

Det är dock Fel™.

Faktiskt inte alltid, men i detta fall är det fel. Standarden säger att om ditt program är "hosted environment" (i.e. kör ovanpå ett OS) så måste main returnera en int. Finns 3 giltiga former

int main(void); int main(int argc, char *argv[]); int main(int argc, char *argv[], char *envp[]);

Däremot så får main() ha vilket returvärde som helst, inklusive void, om ditt program är "freestanding environment", t.ex. ditt program är OSet eller man kör direkt på "metallen".

Men detta är väldigt off-topic och väldigt mycket överkurs

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Hedersmedlem
Skrivet av Yoshman:

Däremot så får main() ha vilket returvärde som helst, inklusive void, om ditt program är "freestanding environment", t.ex. ditt program är OSet eller man kör direkt på "metallen".

Nu är det ju c++ vi diskuterar och där säger väl inte standarden något om just det (men väl att man kanske inte nödvändigtvis behöver ha en main)?

Permalänk
Datavetare
Skrivet av Elgot:

Nu är det ju c++ vi diskuterar och där säger väl inte standarden något om just det (men väl att man kanske inte nödvändigtvis behöver ha en main)?

Sant, detta är C++. Där säger standarden att "int main(void)" samt "int main(int argc, char *argv[])" måste stödjas, samt att programmet i sig aldrig explicit får göra ett anrop till main().

Sedan så tillåter VC++ explicit att main() deklareras med void som returtyp vilket då betyder att main aldrig får avslutas utan programmet måste köra "exit()" för att avsluta. Kanske inte så förvånande att just Windows tillåter "void" för main, är ju ytterst sällan att man bryr sig om detta värde i Windows. Under UNIX är det man skickar till main()/exit() viktigt när man kör i ett skal då det används för att angöra om programmet avslutades korrekt (0) eller om något gick fel (!=0).

Notera också att både C och C++ tillåter detta

int main() { // return <something>; saknas!! }

och i båda fallen är det exakt samma sak som att skriva detta

int main() { return 0; }

Faktiskt lite fascinerande att man lyckats krångla till "main()" så pass mycket

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer