1 / 48

Minnen, variabler, att lagra i primärminnet forts.

Minnen, variabler, att lagra i primärminnet forts. Fördefinierade minnes- variabeltyper. int main() { char tecken; int heltal; float flyttal; double dubbeltFlyttal; ” ”. Array ( vektor, matris ) ett exempel som illustrerar behovet.

Download Presentation

Minnen, variabler, att lagra i primärminnet forts.

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Minnen, variabler,att lagra i primärminnetforts.

  2. Fördefinierade minnes-variabeltyper • int main() { • char tecken; • int heltal; • float flyttal; • double dubbeltFlyttal; • ” • ”

  3. 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. Varför array ? • #include <stdio.h> • int main(void) • { • int temp1, temp2, temp3, temp4, temp5; • int temp6, 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; • } Klumpigt !

  5. Varför array ? #include <stdio.h> int main(void) { int temp[10]; int i; 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; } 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 Bra, hyfsat!

  6. Varför array?

  7. Varför array ? #include <stdio.h> int main(void) { int temp[10]; int i; 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; } 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 Bra, hyfsat!

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

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

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

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

  12. int int Vad är en array ? 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. • for (i=0 ; i<10 ; i++) • printf("\ntemp %d = %d",i, temp[i]); • stega på index • pekarstegningeffektivare = snabbare temp[0] temp[1] temp • int* heltalsPekare; • heltalsPekare = temp ; • for (i=0 ; i<10 ; i++) • printf("\ntemp %d = %d",i,*heltalsPekare++); temp[6] temp[9] heltalspekare

  13. Längden på en array ? • tänk om arrayen inte räcker till ! int main(void) { int temp[10]; int i;

  14. 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) { int temp[10]; int i; int *tempPekare; int n,i,j; printf("Ange antal temperaturer --> "); scanf("%d",&n); tempPekare = (int *) calloc(n,sizeof(int)); for (i=0 ; i<n ; i++){ printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i); }

  15. calloc(), ur manualen Syntax #include <stdlib.h> 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. Vad är skillnaden på de två ? Bytes int *tempPekare; tempPekare = (int *) calloc(n,sizeof(int)); Maskinkod programmet <------ måste avallokeras avprogrammeraren ! Heap 10 st int int temp[10]; Stack 10 st int main() <------ avallokeras automatiskt !

  17. Vad är skillnaden på de två ? Bytes int *tempPekare; tempPekare = (int *) calloc(n,sizeof(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. Maskinkod programmet <------ måste avallokeras! Heap 10 st int int temp[10]; Stack 10 st int main()

  18. Vad är skillnaden på de två ? Bytes int *tempPekare; tempPekare = (int *) calloc(n,sizeof(int)); Maskinkod programmet <------ måste avallokeras! 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. Heap 10 st int int temp[10]; Stack 10 st int main()

  19. #include <stdio.h> • #include <stdlib.h> • int main(void) { • int *tempPekare; • int n,i,j; • printf("Ange antal temperaturer --> "); scanf("%d",&n); • tempPekare = (int *) calloc(n,sizeof(int)); • for (i=0 ; i<n ; i++){ • printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i); • } • for (i=0 ; i<n ; i++) • printf("\ntemp %d = %d",i, tempPekare[i]); • free(tempPekare) ; • return 0; • } Hela programmet

  20. #include <stdio.h> • #include <stdlib.h> • int main(void) { • int *tempPekare; • int n,i,j; • printf("Ange antal temperaturer --> "); scanf("%d",&n); • tempPekare = (int *) calloc(n,sizeof(int)); • for (i=0 ; i<n ; i++){ • printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i); • } • for (i=0 ; i<n ; i++) • printf("\ntemp %d = %d",i, tempPekare[i]); • free(tempPekare) ; • return 0; • } Hela programmet för att en pekare ska kunna användas måste den peka på en känd datatyp. calloc() returnerar en pekare till typen void (ingenting) så måste pekaren ”castas” till att peka på någon känd typ.

  21. Syntax #include <stdlib.h> or #include<alloc.h> 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 funktionför dynamisk minnesallokeringmalloc()

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

  23. char strang1[0] H strang1 e j \0 ? ? ? ? ? ? Kopiera arrayer - strängar • int main() { • char strang1[10]={'H','e','j','\0'}; • char strang2[10]; • char* strangPekare; char strang2[0] ? strang2 ? ? ? ? ? char ? ? ? ? strangPekare ?

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

  25. H e j \0 H e j \0 Kopiera arrayer - strängar • #include <string.h>; • int main() { • strang2 = strang1 ; • strcpy( strang2,strang1); char char strang1[0] detta löser problemet! strang1 strang2[0] ? strang2 ? ? ? ? ? ? ? ? ? ? ?

  26. Matriser • flerdimensionella arrayer • int main() { • int matris[10][3]; matris[8][2] = 5; 5

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

  28. Sortera element i en array • funktion för detta finns redan

  29. Sortera element i en array • funktion för detta finns redan

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

  31. Sortera element i en array qsort() i stdlib.h Wikipedia Quicksort

  32. 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 typså 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. 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. 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. Sortera element i en arrayfunktionspekare • 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. Funktionspekare • på samma sätt som string är en adress till första elementet i arrayen char string[10]; • så är ett funktionsnamn utan parenteser Sorteringsordning adressen till funktionen int Sorteringsordning( void * a , void * b );

  37. Sortering implementerat #include <stdio.h> #include <string.h> #include <stdlib.h> int Sorteringsordning( 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. Funktionen Sorteringsordning() • sorterar på tecknens ASCII-kod int Sorteringsordning( 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. Funktionen Sorteringsordning() • sorterar på summan av tecknens ASCII-kodbitmönster int Sorteringsordning( 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. Funktionen BinSumma() • sorterar på summan av tecknens ASCII-kodbitmönster int BinSumma( char tal ) { int rest ; static int langd = 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. #include <stdio.h> #include <string.h> #include <stdlib.h> 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 ; } int Sorteringsordning( 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 int langd = 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. Sortera strängarna char list[5][4] = { "cat", "car", "cab", "cap", "can" }; c c c c c a a a a a t r b p n \0 \0 \0 \0 \0

  43. Sortera strängar /* qsort example */ #include <stdio.h> #include <stdlib.h> #include <string.h> 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) ); } • i sort_function() kan man använda strcmp()

  44. Sortera strängar _fstricmp, strcmp, strcmpi, stricmp <STRING.H> 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 • i sort_function() kan man använda strcmp()

  45. Sortera strängar _fstricmp, strcmp, strcmpi, stricmp <STRING.H> 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 • i sort_function() kan man använda strcmp() • OBS! Å Ä Ö

  46. Sortera strängar strcoll <STRING.H> 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 • i sort_function() kan man använda strcoll() • OBS! Å Ä Ö

  47. Sökning i strängar • _fstrstr, strstr <STRING.H> • 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. Slut

More Related