Presentation laddar. Vänta.

Presentation laddar. Vänta.

Anders Sjögren Minnen, variabler, att lagra i primärminnet forts.

Liknande presentationer


En presentation över ämnet: "Anders Sjögren Minnen, variabler, att lagra i primärminnet forts."— Presentationens avskrift:

1 Anders Sjögren Minnen, variabler, att lagra i primärminnet forts.

2 Anders Sjögren Fördefinierade minnes- variabeltyper int main() { chartecken; intheltal; floatflyttal; doubledubbeltFlyttal; ”

3 Anders Sjögren Array ( vektor, matris ) ett exempel som illustrerar behovet Antag att man vill mäta temperaturen flera gånger och spara värdena för statistisk behandling. Hur gör man ett program som läser in flera mätvärden?

4 Anders Sjögren #include int main(void) { inttemp1, temp2, temp3, temp4, temp5; inttemp6, temp7, temp8, temp9, temp10; printf("Ge temperatur --> "); scanf("%d",&temp1); printf("Ge temperatur --> "); scanf("%d",&temp2); printf("Ge temperatur --> "); scanf("%d",&temp3); printf("Ge temperatur --> "); scanf("%d",&temp4); printf("Ge temperatur --> "); scanf("%d",&temp5); printf("Ge temperatur --> "); scanf("%d",&temp6); printf("Ge temperatur --> "); scanf("%d",&temp7); printf("Ge temperatur --> "); scanf("%d",&temp8); printf("Ge temperatur --> "); scanf("%d",&temp9); printf("Ge temperatur --> "); scanf("%d",&temp10); printf("\ntemp = %d", temp1); return 0; } Varför array ? Klumpigt !

5 Anders Sjögren #include int main(void) { inttemp[10]; inti; for (i=0 ; i<10 ; i++){ printf("Ge temperatur %d --> ",i); scanf("%d",&temp[i]); } for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); return 0; } Varför array ? Bra, hyfsat! detta skapar 10 st minnen i primärminnet ( på stacken i detta fall) som vardera kan lagra en int. En array ( vektor ) om 10 element har sett dagens ljus

6 Anders Sjögren Varför array?

7 Anders Sjögren #include int main(void) { inttemp[10]; inti; for (i=0 ; i<10 ; i++){ printf("Ge temperatur %d --> ",i); scanf("%d",&temp[i]); } for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); return 0; } Varför array ? Bra, hyfsat! detta skapar 10 st minnen i primärminnet ( på stacken i detta fall) som vardera kan lagra en int. En array ( vektor ) om 10 element har sett dagens ljus

8 Anders Sjögren symboldefinitioner Maskinkod programmet Heap Stack Bytes Ett minnesutrymme, variabel, i primärminnet Ett minnesutrymme, variabel, i primärminnet som kan lagra en adress dvs en pekare. Pekaren kan tilldelas ett nytt värde. En adress, pekare vars värde är konstant.

9 Anders Sjögren Vad är en array ? *temp == temp[0] temp[1] temp[9] temp temp[0] temp[6] int int main(void) { inttemp[10]; inti; int main(void) { inttemp[10]; inti; Maskinkod programmet Heap Stack Bytes OBS! Första index- nummer är 0 !!

10 Anders Sjögren Vad är en array ? stega på index int temp[1] temp[9] temp temp[0] temp[6] int for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]);

11 Anders Sjögren Vad är en array ? stega på index int temp[1] temp[9] temp temp[0] temp[6] int for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); pekarstegning effektivare = snabbare int* heltalsPekare; heltalsPekare = temp ; for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i,*heltalsPekare++); heltalspekare

12 Anders Sjögren Vad är en array ? stega på index int temp[1] temp[9] temp temp[0] temp[6] int for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i, temp[i]); pekarstegning effektivare = snabbare int* heltalsPekare; heltalsPekare = temp ; for (i=0 ; i<10 ; i++) printf("\ntemp %d = %d",i,*heltalsPekare++); heltalspekare ofta är kompilatorerna standardmässigt inställda på att optimera maskinkoden så indexstegning översätts till pekar- stegning vid kompilering. Vill man ändra på detta måste man ändra kompilatordirektiven. Man kan studera detta genom att kompilera mot assemblerkod.

13 Anders Sjögren Längden på en array ? tänk om arrayen inte räcker till ! int main(void) { inttemp[10]; inti;

14 Anders Sjögren Längden på en array ? om man inte vet längden på arrayen i förväg så kan man allokera minne dynamiskt under exekvering int main(void) { inttemp[10]; inti; int main(void) { inttemp[10]; inti; int*tempPekare; intn,i,j; printf("Ange antal temperaturer --> "); scanf("%d",&n); tempPekare = (int *) calloc(n,sizeof(int)); for (i=0 ; i ",i); scanf("%d",tempPekare+i); }

15 Anders Sjögren calloc(), ur manualen Syntax #include void *calloc(size_t nitems, size_t size); Description Allocates main memory. calloc provides access to the C memory heap. The heap is available for dynamic allocation of variable-sized blocks of memory. Many data structures, such as trees and lists, naturally employ heap memory allocation. All the space between the end of the data segment and the top of the program stack is available for use in the small data models (small and medium),except for a small margin immediately before the top of the stack. This margin allows room for the application to grow on the stack, and provides a small amount of room needed by the operating system. In the large data models (compact, large, and huge), all space beyond the program stack to the end of physical memory is available for the heap. calloc allocates a block of size nitems * size. The block is cleared to 0. If you want to allocate a block larger than 64K, you must use farcalloc. Return Value calloc returns a pointer to the newly allocated block. If not enough space exists for the new block or if nitems or size is 0, calloc returns NULL.

16 Anders Sjögren Vad är skillnaden på de två ? < måste avallokeras av programmeraren ! inttemp[10]; int*tempPekare; tempPekare = (int *) calloc(n,sizeof(int)); Maskinkod programmet Heap Stack Bytes main() 10 st int 10 st int < avallokeras automatiskt !

17 Anders Sjögren Vad är skillnaden på de två ? < måste avallokeras! inttemp[10]; int*tempPekare; tempPekare = (int *) calloc(n,sizeof(int)); Maskinkod programmet Heap Stack Bytes main() 10 st int 10 st int Det är jag som programmerare som ansvarar för att minne, allokerat dynamiskt på heapen, tas bort. Annars finns de kvar så länge programmet finns kvar.

18 Anders Sjögren Vad är skillnaden på de två ? < måste avallokeras! inttemp[10]; int*tempPekare; tempPekare = (int *) calloc(n,sizeof(int)); Maskinkod programmet Heap Stack Bytes main() 10 st int 10 st int Jag måste också akta mig noga så jag inte skriver över adressen som nu finns lagrad i tempPekare. Om jag gör det så får jag ett borttappat ( dinglande) minne som inte kan användas eller avallokeras.

19 Anders Sjögren #include int main(void) { int*tempPekare; intn,i,j; printf("Ange antal temperaturer --> "); scanf("%d",&n); tempPekare = (int *) calloc(n,sizeof(int)); for (i=0 ; i ",i); scanf("%d",tempPekare+i); } for (i=0 ; i

20 Anders Sjögren #include int main(void) { int*tempPekare; intn,i,j; printf("Ange antal temperaturer --> "); scanf("%d",&n); tempPekare = (int *) calloc(n,sizeof(int)); for (i=0 ; i ",i); scanf("%d",tempPekare+i); } for (i=0 ; i

21 Anders Sjögren Syntax #include or #include void *malloc(size_t size) ; Description Allocates main memory. malloc allocates a block of size bytes from the memory heap. It allows a program to allocate memory explicitly as it's needed, and in the exact amounts needed. The heap is used for dynamic allocation of variable-sized blocks of memory. Many data structures, for example, trees and lists, naturally employ heap memory allocation. All the space between the end of the data segment and the top of the program stack is available for use in the small data models, except for a small margin immediately before the top of the stack. This margin is intended to allow the application some room to make the stack larger, in addition to a small amount needed by DOS. In the large data models, all the space beyond the program stack to the end of available emory is available for the heap. Return Value On success, malloc returns a pointer to the newly allocated block of memory. If not enough space exists for the new block, it returns NULL. The contents of the block are left unchanged. If the argument size == 0, malloc returns NULL. Det finns yttterligare en funktion för dynamisk minnesallokering malloc()

22 Anders Sjögren Strängar att hantera text strängar är en array av tecken sista tecknet skall vara ’\0’, ASCII nr 0 strang1 strang1[0] char H e j \0 ? ? ? ? ? ? int main() { charstrang1[10]={'H','e','j','\0'}; strang1[9]

23 Anders Sjögren Kopiera arrayer - strängar int main() { charstrang1[10]={'H','e','j','\0'}; charstrang2[10]; char* strangPekare; strang1 strang1[0] char H e j \0 ? ? ? ? ? ? strang2 strang2[0] char ? ? ? ? ? ? ? ? ? ? strangPekare ? char

24 Anders Sjögren Kopiera arrayer - strängar int main() { strang2 = strang1 ; strangPekare = strang1; strang1 strang1[0] char H e j \0 ? ? ? ? ? ? strang2 strang2[0] char ? ? ? ? ? ? ? ? ? ? strangPekare ? char tilldelar bara adressen till element 0.

25 Anders Sjögren Kopiera arrayer - strängar #include ; int main() { strang2 = strang1 ; strcpy( strang2,strang1); strang1 strang1[0] char H e j \0 ? ? ? ? ? ? strang2 strang2[0] char ? ? ? ? ? ? H e j \0 detta löser problemet!

26 Anders Sjögren Matriser flerdimensionella arrayer intmain() { intmatris[10][3]; 5 matris[8][2] = 5;

27 Anders Sjögren Sortera element i en array funktionspekare införs antag att man vill sortera bokstäverna i en sträng string string[0] char H e j \0 ? ? ? ? ? ?

28 Anders Sjögren Sortera element i en array funktion för detta finns redan

29 Anders Sjögren Sortera element i en array funktion för detta finns redan

30 Anders Sjögren Sortera element i en array funktion för detta finns redan qsort() i stdlib.h

31 Anders Sjögren Sortera element i en array qsort() i stdlib.h Wikipedia Quicksort

32 Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt void *base är en pekare till ”vad som helst” men som kan konverteras (cast) att peka på någon känd typ. Missar man att göra en cast till känd typ så sker en implicit konvertering. I detta fall ska det vara en pekare till 1:a elementet i arrayen som skall sorteras. void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

33 Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt size_t är ett makro som i ANSI-standard anger typen på returvärdet för funktionen sizeof(). Här ska man ange hur många element det finns i arrayen som skall sorteras. void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

34 Anders Sjögren Sortera element i en array funktion för detta finns redan och prototypen ser ut på följande sätt size_t är ett makro som i ANSI-standard anger typen på returvärdet för funktionen sizeof(). Här ska man ange hur stort varje ( i bytes) element i arrayen som skall sorteras är. void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

35 Anders Sjögren Sortera element i en array funktionspekare funktion för detta finns redan och prototypen ser ut på följande sätt pekare till en funktion (funktionspekare) vars argument är två void-pekare och som returnerar en int. Denna funktion specifierar hur det skall sorteras. Funktionen döper man och skriver själv. void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));

36 Anders Sjögren Funktionspekare på samma sätt som string är en adress till första elementet i arrayen charstring[10]; så är ett funktionsnamn utan parenteser Sorteringsordning adressen till funktionen intSorteringsordning( void * a, void * b );

37 Anders Sjögren Sortering implementerat #include intSorteringsordning( const void* a, const void* b); int main ( void ) { char string[10]={ '\0' } ; int i ; printf("Skriv text max 9 tecken: --> "); scanf("%s", string); qsort( (void*) string, strlen( string ), sizeof( char ), Sorteringsordning ); for ( i=0; string[i]!='\0' ; i++) printf("%c", string[i]); return 0 ; }

38 Anders Sjögren Funktionen Sorteringsordning() sorterar på tecknens ASCII-kod intSorteringsordning( const void* a, const void* b){ if ( *((char *)a) < *((char *)b) ) return -1 ; else if ( *((char *)a) > *((char *)b) ) return 1 ; else return 0 ; }

39 Anders Sjögren Funktionen Sorteringsordning() sorterar på summan av tecknens ASCII- kodbitmönster intSorteringsordning( const void* a, const void* b){ int summaA, summaB; summaA = BinSumma(*((char *)a)); summaB = BinSumma(*((char *)b)) ; if ( summaA < summaB) return -1 ; else if ( summaA > summaB) return 1 ; else if ( *((char *)a) < *((char *)b) ) return -1 ; else if ( *((char *)a) > *((char *)b) ) return 1 ; else return 0 ; }

40 Anders Sjögren Funktionen BinSumma() sorterar på summan av tecknens ASCII- kodbitmönster int BinSumma( char tal ) { int rest ; static intlangd = 0; langd++ ; rest = tal % 2 ; tal /= 2 ; if (tal==0 || langd==8) { /* summerar över 1 byte */ langd = 0 ; return rest ; } else return rest + BinSumma( tal ); } Blev samma! (men inte alltid – å ä ö …)

41 Anders Sjögren #include int Sorteringsordning( const void* a, const void* b); int BinSumma( char tal ); int main ( void ) { char string[10]={ '\0' } ; int i ; printf("Skriv text max 9 tecken: --> "); scanf("%s", string); qsort( (void*) string, strlen( string ), sizeof( char ), Sorteringsordning ); for ( i=0; string[i]!='\0' ; i++) printf("%c", string[i]); return 0 ; } intSorteringsordning( const void* a, const void* b){ int summaA, summaB; summaA = BinSumma(*((char *)a)); summaB = BinSumma(*((char *)b)) ; if ( summaA < summaB) return -1 ; else if ( summaA > summaB) return 1 ; else if ( *((char *)a) < *((char *)b) ) return -1 ; else if ( *((char *)a) > *((char *)b) ) return 1 ; else return 0 ; return 0 ; } int BinSumma( char tal ) { int rest ; static intlangd = 0; langd++ ; rest = tal % 2 ; tal /= 2 ; if (tal==0 || langd==8) { /* summerar över 1 byte */ langd = 0 ; return rest ; } else return rest + BinSumma( tal ); } Hela programmet, översikt main() Sorteringordning() BinSumma()

42 Anders Sjögren Sortera strängarna char list[5][4] = { "cat", "car", "cab", "cap", "can" }; c a t \0 c a r c a b c a p c a n

43 Anders Sjögren /* qsort example */ #include int sort_function( const void *a, const void *b); char list[5][4] = { "cat", "car", "cab", "cap", "can" }; int main(void) { int x; qsort((void *)list, 5, sizeof(list[0]), sort_function); for (x = 0; x < 5; x++) printf("%s\n", list[x]); return 0; } int sort_function( const void *a, const void *b) { return( strcmp((char *)a,(char *)b) ); } Sortera strängar i sort_function() kan man använda strcmp()

44 Anders Sjögren _fstricmp, strcmp, strcmpi, stricmp Declaration int strcmp(const char * s1, const char * s2); Remarks strcmp performs an unsigned comparison of s1 to s2. Return Value These routines return an int value that is -< 0 if s1 < s2 -== 0 if s1 == s2 -> 0 if s1 > s2 Sortera strängar i sort_function() kan man använda strcmp()

45 Anders Sjögren _fstricmp, strcmp, strcmpi, stricmp Declaration int strcmp(const char *s1, const char*s2); Remarks strcmp performs an unsigned comparison of s1 to s2. Return Value These routines return an int value that is -< 0 if s1 < s2 -== 0 if s1 == s2 -> 0 if s1 > s2 Sortera strängar i sort_function() kan man använda strcmp() OBS! Å Ä Ö

46 Anders Sjögren strcoll Compares two strings Declaration int strcoll(char *s1, char *s2); Remarks strcoll compares the string *s1 to the string *s2, according to the collating sequence set by setlocale(). Return Value strcoll returns a value that is -< 0 if s1 < s2 -== 0 if s1 == s2 -> 0 i f s1 > s2 Sortera strängar i sort_function() kan man använda strcoll() OBS! Å Ä Ö

47 Anders Sjögren Sökning i strängar _fstrstr, strstr Finds the first occurrence of a substring in another string Declaration char *strstr(const char *s1, const char *s2); Remarks strstr scans s1 for the first occurrence of the substring s2. Return Value -On success, strstr returns a pointer to the element in s1 where s2 begins (points to s2 in s1). -On error (if s2 does not occur in s1), strstr returns null.

48 Anders Sjögren Slut


Ladda ner ppt "Anders Sjögren Minnen, variabler, att lagra i primärminnet forts."

Liknande presentationer


Google-annonser