100 likes | 223 Views
Funktion som byter plats på två variabler.
E N D
Funktion som byter plats på två variabler /* swap1.c first attempt at a swaping function *//* from Stephen Prata, C Primer Plus ISBN 1-571969-161-8 */ #include <stdio.h>void interchange(int u, int v);int main(void){ int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(x, y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0;}void interchange(int u, int v){ int temp; temp = u; u = v; v = temp;} William Sandqvist william@kth.se
Funktionen fungerar ej Funktionen void interchange( int u, int v) får ju bara kopior av x och y och kan därför inte påverka orginalen talen x och y i main. För att byta plats på två tal krävs två returvärden, och C-funktioner har som mest ett returvärde. William Sandqvist william@kth.se
pekare * adress & och avreferering * 18 18 18 19 int b; Deklaration av heltalsvariabeln b. Plats reserveras. b = 18; Definition av variabeln b. Nu innehåller den talet 18. &b Adressoperatorn. Adressen till variabeln b. int * c; Deklaration av int-pekarvariabeln c. c = &b; Nu pekar c på b. *c Avrefereringsoperatorn. Det som c pekar på. *c = 19; Talet 19 lagras på den plats som c pekar ut. Nu innehåller b = 19. ( ) ( ) ( ) Mer om detta senare i kursen, men det behövs redan nu … William Sandqvist william@kth.se
Funktion som byter plats på två variabler /* swap3.c pointers to make a swapping function work *//* from Stephen Prata, C Primer Plus ISBN 1-571969-161-8 */#include <stdio.h>void interchange(int *, int *);int main(void){int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0;}void interchange(int * u, int * v){ int temp; temp = *u; *u =*v; *v = temp;} William Sandqvist william@kth.se
Nu fungerar det! Funktionens parametrar, u och v är nu ”kopior” av adresserna till variablerna x och y (&x, &y). Med hjälp av de medskickade adresserna kan funktionen returnera värden till x och y. temp = *u; *u = *v; *v = temp; Förutom en C-funktions returvärde kan funktionen även ge retur till adresser som angivits i parameterlistan! William Sandqvist william@kth.se
( Kan man klara sig utan mellanvariabeln? ) XOR får Du lära dig nästa gång! … Cliff-hanger! William Sandqvist william@kth.se
( utan mellanvariabel ) XOR swap algorithm void interchange(int * u, int * v){ *u ^= *v; *v ^= *u; *u ^= *v;} ? Nördvarning! William Sandqvist william@kth.se
( Funktion som byter på två variabler ) /* swap4.c pointers to make a swapping function work *//* from Stephen Prata, C Primer Plus ISBN 1-571969-161-8 */#include <stdio.h>void interchange(int *, int *);int main(void){int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0;}void interchange(int * u, int * v){ *u ^= *v; *v ^= *u; *u ^= *v;} William Sandqvist william@kth.se
( Mind swap? ) Hur löser Hollywood-filmerna egentligen mellanlagringen av medvetandet …. XOR-swap? Var mellanlagrar man medvetandet? William Sandqvist william@kth.se