4: Fylki og minni í C Flashcards
Fylki í C
Fylki er fastur fjöldi staka af sama tagi
Strengir í C
Strengir eru fylki af char stökum
Verða að enda á sérstöku núlltákni, ‘\0’
Bókstafir hafa einfaldar gæsalappir (‘a’, ‘$’, ‘\n’, …), en strengir hafa tvöfaldar gæsalappir (“halló”, “hér”, …)
Skilgreining strengja:
char litur[] = “blár”;
char *litp = “gulur”;
Strengjavinnsluföll
Mikið af föllum til að vinna með strengi í string.h:
Eru upplýsingar um lengdir á streng í C?
Nei, ekki hægt að vita
char *strcpy(char *dest, char *src)
Afritar src streng yfir í dest, ásamt núll-bæti
char *strncpy(char *dest, char *src, size_t n)
Afritar mest n stafi yfir í dest
char *strcat(char *dest, char *src)
Setur afrit af src aftan við dest, skilar dest
char *strncat(char *dest, char *src, size_t n)
Setur afrit af src aftan við dest, notar mest n tákn
size_t strlen(const char *str)
Skilar lengd strengs (telur ekki núll-bætið)
Minnisnotkun í C
skipanalínuviðföng
hlaði (stack)
kös (heap)
óupphafsstillt gögn (BSS)
upphafsstillt gögn
forritskóði (text)
Hvernig úthlutum við minni úr kös?
Úthlutum minni úr kös með malloc (eða calloc) og skilum því til baka með free
void* malloc(size_t size)
Tekur frá óupphafsstillt minni af stærð size bæti
void* calloc(size_t num, size_t size)
Tekur frá núllstillt fylki með num stökum, hvert þeirra size bæti
void free(void* ptr)
Skilar aftur minni sem úthlutað var með malloc eða calloc
Ýmsar reglur um minnisúthlutun
Skila alltaf öllu minni (með free) sem fengið er með malloc
Ef öllu minninu er ekki skilað þá verður minnisleki
Aldrei nota bendi eftir að honum hefur verið skilað
Nota aðeins malloc þegar það er nauðsynlegt
Aldrei nota bendi eftir að honum hefur verið skilað, afhverju?
Ekki lengur gildur og getur valdið mjög erfiðum minnisvillum
Nota aðeins malloc þegar það er nauðsynlegt, hvenær?
Fyrir gagnagrindur af breytilegri stærð sem lifa lengi
Hvað er Fjölvar (macros)?
Leið til að skipta út nafni fyrir skilgreiningu
Virkar svipað og “finna og skipta út” (find-replace)
Notkun fjölva:
Skilgreining fasta (t.d. INT_MAX)
Skilgreining einfaldra aðgerða (t.d. MAX(a, b))
Dæmi:
#define INT_MAX 0x7FFFFFFF
#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define WORD_SIZE 4
Notum mest forritasafnið stdio.h
Það hefur föll til að vinna með staðalinntak, staðalúttak og
skrár
Staðalúttak:
int printf(char *format, arg1, arg2, …)
Prentar viðföngin arg1, arg2 , á staðalúttak samkvæmt sniðinu format
Staðalinntak:
int scanf(char *format, arg1, arg2, …)
Les inn í breyturnar arg1, arg2 (sem verða að vera bendar!)
Skráarvinnsla í C hefur eftirfarandi skref:
– Opna skrá (fopen)
– Lesa úr skrá (fscanf), skrifa í skrá (fprintf) – Loka skrá (fclose)
C lítur á skrár sem ?
Runu bæta
Hversu lengi er skrá opin í C?
Eftir að skrá hefur verið opnuð þá er hún opin þar til henni er lokað eða forritið hættir keyrslu
FILE *fopen(char *fname, char *mode)
Opnar skránna með nafnið fname samvkæmt mode (lesa, skrifa…) og skilar skrárhaldi
int fscanf(FILE *fptr, char *format, …)
Les gögn úr skránni fptr samkvæmt sniðinu format
int fprintf(FILE *fptr, char *format, …)
Skrifar í skránna fptr samkvæmt sniðinu format
int fclose(FILE *fptr)
Lokar skráarhaldinu fptr
Að opna skrá:
Opnum skrá með fopen
Gefum upp hvernig við ætlum að nota hana
• “r” þýðir lestur, “w” þýðir skrift, “a” þýðir að skrifa aftast
Nokkur föll til að lesa úr skrá :
– fscanf − les gögn í breytur samkvæmt sniðmáti – fgetc − lesa einn staf úr skrá
– fgets − lesa streng úr skrá
Nokkur föll til að skrifa í skrá:
– fprintf − skrifa gögn í skrá samkvæmt sniðmáti
– fputc − skrifa einn staf í skrá
– fputs − skrifa streng í skrá
Hvað gerir forritið make?
Hjálpar til við að smíða keyrsluskrár á sjálfvirkan hátt
Búum til verkefnaskrá (makefile) fyrir hvert
forritunarverkefni, reglur :
Verkefnaskrá inniheldur reglur:
mark (target): forsendur (dependencies) aðgerðir (commands)