Funktioner
- skrev denne artikel Torsdag, 29 December 2005
Forudsætninger: Jeg går ud fra du har læst introduktionen og at du har kendskab til løkker og arrays.
Funktioner i programmering og funktioner i matematik er ikke det samme, alligevel har de visse ting til fælles f.eks. kan man som regel forvente at en funktion giver samme output hver gang den får det samme input, indtil nu har vores programmer kun bestået af 1 funktion som kaldte et par funktioner fra forskellige biblioteker i C kaldes disse biblioteker headerfiler. Headerfiler vil blive nærmere forklaret under "definitioner og headerer".
Den funktion vi har brugt indtil nu var WinMain funktionen den skal være med i ethvert C program til Windows (teknisk set er den ikke nødvendig før vi laver vores egne vinduer). Men nok om hvad det er vi skulle jo gerne lave vores egne funktioner, en funktion starter med en variabel type som int char eller bool, herefter har Windows nogle gange lige et speciel ord den vil have ind som WINAPI, derefter kommer funktionens navn og til sidst hvilke argumenter(variable) den får med disse skal stå med deres typer og separeret af komma. En funktion er kun gyldig efter den er erklæret så ofte gør vi ligesom med variable og erklærer dem i starten af programmet (før WinMain men efter #include). Lad os tage et eksempel:

001   #include <windows.h>
002  
003   void svar_sandt();
004   bool svar_falsk(char *besked);
005  
006   int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow){
007    int svar;
008    svar=MessageBox(0,"Er du dygtig?","Hej",MB_YESNO);
009    if(svar==IDYES)
010      svar_sandt();
011    else
012      if(!svar_falsk("Noget må du være da være god til, ikke sandt?"))
013        MessageBox(0,"Du er godt nok pesimistisk","Hmmm",MB_ICONEXCLAMATION);
014    return 0;
015   }
016  
017   void svar_sandt(){
018    MessageBox(0,"Jeg er også god til noget","Godt",MB_OK);
019   }
020  
021   bool svar_falsk(char *besked){
022    if(MessageBox(0,besked,"Trist",MB_YESNO)==IDYES)
023      return true;
024    else
025      return false;
026   }


I linie 8, er MB_OK skiftet ud med MB_YESNO dette laver boksen om til et ja/nej spørgsmål, udover dette er linien et eksempel på hvordan en funktions retur-værdi. Vi tildeler den her til en variabel men vi kunne også bare have skrevet if(MessageBox(0,"Er du dygtig?","Hej",MB_YESNO)==IDYES) i stedet for. Men jeg mente dette eksempel var mere illustrativt, og det andet bruges jo i linie 12.
I linie 17 og 21 er der eksempler på hvordan man kan skrive sine egne funktioner, return er så den værdi som funktionen returnerer. Jeg bør måske lige forklare void, void kan have flere betydninger i C og C++ men når det står foran et funktionsnavn er det fordi funktionen IKKE returnerer en værdi. I ANSI C standarden er det ok at have main som en void, i Dev-C++ er det ikke, dette berører ikke dig da du er ved at lære Windows Programmering og WinMain er altid en int WINAPI funktion. senere skal vi se på en anden type specielle Windows funktioner, men mere om det under GUI intro.

Det skal bemærkes at en C funktion kun får en kopi af variablens værdi, den kan derfor ikke direkte ændre værdien af de argumenter den får med. I stedet kan man så sende adressen med, mere om dette under pointere.
Hvis man vil have lov til at ændre en variabel, kan man i stedet vælge at lave den som en global variabel, eller man kan sende dens fysiske placering i hukommelsen i stedet for.
Globale variabler laves ved at erklære dem før WinMain, på den måde kan de ses af alle funktioner, den anden metode benytter sig af pointere, for at bruge dette sætter man en * foran variabelnavnet og når man så vil sende en variabels adresse med i stedet for dens værdi sætter man en & foran den. Dette lyder måske forvirrende så lad os tage et eksempel.

001   #include <windows.h>
002  
003   void eks1(int nr);
004   void eks2(int *nr);
005  
006   int global;
007  
008   int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow){
009    int nr=0;
010    global=3;
011    char output[512];
012    wsprintf(output,"nr: %d",nr);
013    MessageBox(0,output,"nr:",MB_OK);
014    eks1(nr);
015    wsprintf(output,"nr: %d",nr);
016    MessageBox(0,output,"nr:",MB_OK);
017    eks2(&nr);
018    wsprintf(output,"nr: %d",nr);
019    MessageBox(0,output,"nr:",MB_OK);
020   }
021  
022   void eks1(int nr){
023    nr=global;
024   }
025  
026   void eks2(int *nr){
027    *nr=global;
028   }


kør programmet og læg mærke til at nr ikke ændres til 3 før eks2 bliver kørt, læg også mærke til at global bliver sat til 3 i WinMain og senere kan bruges i andre funktioner som om det var samme variabel.
har du spørgsmål så skriv til mig på:
admin@AODASoft.net