Presentation is loading. Please wait.

Presentation is loading. Please wait.

C: Advanced Topics Winter 2013 COMP 2130 Intro Computer Systems Computing Science Thompson Rivers University.

Similar presentations


Presentation on theme: "C: Advanced Topics Winter 2013 COMP 2130 Intro Computer Systems Computing Science Thompson Rivers University."— Presentation transcript:

1 C: Advanced Topics Winter 2013 COMP 2130 Intro Computer Systems Computing Science Thompson Rivers University

2 TRU-COMP2130 Data Representation2 Course Objectives The better knowledge of computer systems, the better programing. Computer SystemC Programming Language Computer architecture CPU (Central Processing Unit) IA32 assembly language Introduction to C language Compiling, linking, loading, executing Physical main memory MMU (Memory Management Unit) Virtual memory space Memory hierarchy Cache Dynamic memory management Better coding – locality Reliable and efficient programming for power programmers (to avoid strange errors, to optimize codes, to avoid security holes, …)

3 TRU-COMP2130 C: Advanced Topics3 Course Contents Introduction to computer systems: B&O 1 Introduction to C programming: K&R 1 – 4 Data representations: B&O 2.1 – 2.4 C: advanced topics: K&R 5.1 – 5.10, 6 – 7 Introduction to IA32 (Intel Architecture 32): B&O 3.1 – 3.8, 3.13 Compiling, linking, loading, and executing: B&O 7 (except 7.12) Dynamic memory management – Heap: B&O 9.9.1 – 9.9.2, 9.9.4 – 9.9.5, 9.11 Code optimization: B&O 5.1 – 5.6, 5.13 Memory hierarchy, locality, caching: B&O 5.12, 6.1 – 6.3, 6.4.1 – 6.4.2, 6.5, 6.6.2 – 6.6.3, 6.7 Virtual memory (if time permits): B&O 9.4 – 9.5

4 TRU-COMP2130 C: Advanced Topics4 Unit Learning Objectives Use pointers and references. Use pointers for dynamic memory management. Use open(), read(), write(), close(), and FILE* functions to manipulate files. Use user-defined data structures. More coming

5 TRU-COMP2130 C: Advanced Topics5 Unit Contents 1. Pointers and Arrays 2. Structures 3. Input and Output

6 TRU-COMP2130 C: Advanced Topics6 1. Pointers and Arrays

7 TRU-COMP2130 C: Advanced Topics7 Pointers and Addresses A pointer is a variable that contains the address of a variable. Pointers and arrays are very closely related. int x = 1, y = 2, z[10]; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ y = *ip; /* y is now 1 */ *ip = 0; /* x is now 0 */ ip = &z[1]; /* ip now points to z[1] */ Declaration of a pointer variable:* Reference operator: & Indirection operator (oac dereference operator):*

8 TRU-COMP2130 C: Advanced Topics8 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; Varible name valueaddress x1A... y2B zEC ip?D... z[0]?E z[1]?F z[2]?... z[3]?

9 TRU-COMP2130 C: Advanced Topics9 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; Varible name valueaddress x1A... y2B zEC ip A D... z[0]?E z[1]?F z[2]?... z[3]?

10 TRU-COMP2130 C: Advanced Topics10 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; Varible name valueaddress x1A... y 1 B zEC ipAD... z[0]?E z[1]?F z[2]?... z[3]?

11 TRU-COMP2130 C: Advanced Topics11 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; Varible name valueaddress x 0 A... y1B zEC ipAD... z[0]?E z[1]?F z[2]?... z[3]?

12 TRU-COMP2130 C: Advanced Topics12 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; *ip = 5; Varible name valueaddress x0A... y1B zEC ip F D... z[0]?E z[1]?F z[2]?... z[3]?

13 TRU-COMP2130 C: Advanced Topics13 int x = 1; int y = 2; int z[10]; int *ip; ip = &x; y = *ip; *ip = 0; ip = &z[1]; *ip = 5; Varible name valueaddress x0A... y1B zEC ip F D... z[0]?E z[1]5F z[2]?... z[3]?

14 TRU-COMP2130 C: Advanced Topics14 Pointers and Function Arguments How to write a function that swaps the values stored in two variables? swap(a, b);... void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Is the above function correct? Why? At assembly time, this function call will be expanded to create three variables in the stack area. The stack pointer will be increased as the result. The return statement is hidden. At assembly time, the return statement will be expanded to delete three variables in the stack area. The stack pointer will be decreased as the result.

15 TRU-COMP2130 C: Advanced Topics15 swap(a, b);... void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Varible name valueaddress a1A... b2B x1C y2D temp?E... At this moment

16 TRU-COMP2130 C: Advanced Topics16 swap(a, b);... void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Varible name valueaddress a1A... b2B x2C y1D temp1E... At this moment

17 TRU-COMP2130 C: Advanced Topics17 swap(a, b);... void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Varible name valueaddress a1A... b2B At this moment

18 TRU-COMP2130 C: Advanced Topics18 How to write a function that swaps the values stored in two variables? swap(&a, &b);... void swap(int *px, int* py) { int temp; temp = ???; ???; ??? = temp; } Varible name valueaddress a1A... b2B pxAC pyBD tmp?E... At this moment

19 TRU-COMP2130 C: Advanced Topics19 swap(&a, &b);... void swap(int *px, int* py) { int temp; temp = *px; *px = *py; *py = temp; } Varible name valueaddress a1A... b2B pxAC pyBD tmp1E...

20 TRU-COMP2130 C: Advanced Topics20 swap(&a, &b);... void swap(int *px, int* py) { int temp; temp = *px; *px = *py; *py = temp; } Varible name valueaddress a2A... b2B pxAC pyBD tmp1E...

21 TRU-COMP2130 C: Advanced Topics21 swap(&a, &b);... void swap(int *px, int* py) { int temp; temp = *px; *px = *py; *py = temp; } Varible name valueaddress a2A... b1B pxAC pyBD tmp1E...

22 TRU-COMP2130 C: Advanced Topics22 swap(&a, &b);... void swap(int *px, int* py) { int temp; temp = *px; *px = *py; *py = temp; } Varible name valueaddress a2A... b1B

23 TRU-COMP2130 C Programming23 int*test; intnumber = 20; test = &number; printf(“%d, %d, %p, %p\n”, number, *test, test, &test); // the content of the var pointed by test // the content of test *test = 30; printf(“%d, %d, %p, %p\n”, number, *test, test, &test); printf(“Enter an integer: ”); scanf(“%d”, &number); // the address of number printf(“%d, %d, %d, %p, %p, %p\n”, number, *test, *(&number), test, &test, &number);// the content pointed by test // the content pointed //by the address of number // the content of test // the address of test // the address of number

24 TRU-COMP2130 C: Advanced Topics24 Can you write a function to read multiple integers into an array? intdata[10]; getint(data, 10); // read 10 integers into data[]... ??? getint(???, ???) { ???// using scanf() }

25 TRU-COMP2130 C: Advanced Topics25 Pointers and Arrays Strong relation between and pointers float *px; // px is ready to store an address. float x[10]; // x represents 10 float type variables, // x[0], x[1],..., x[9], that are // alocated in cosecutive memory area. // x has the address of x[0]. float y; x[0] = 2; x[1] = 3; x[2] = 4; x[3] = 5; x[4] = 6; x[5] = 7; px = x;// the same data type? y = *px; printf(“%f, %f, %f\n”, x[0], *px, y); // ??? px = &x[2]; y = *(px+2); printf(“%f, %f, %f\n”, x[0], *px, y); // ???

26 TRU-COMP2130 C Programming26 intnumber[10]; printf(“%p\n”, &(number[0])); printf(“%p\n”, &(number[5])); printf(“%p\n”, number); // related to reference printf(“%p\n”, number + 5); // the address of number[5] // not 5 * 4 newval(number);... void newval(int num[]) { num[0] = 5;... }, or void newval(int* num) { *num = 5; *(num+1) = 10; num[2] = 20;... } int num[] and int *num are equivalent.

27 TRU-COMP2130 C Programming27 intnumber[10]; int *p, *q; *p = 10;// Is it wrong? p = number; q = &number[0]; number[0] = 2; number[1] = 9; number[2] = 5; printf(“%p, %p\n”, p, q); printf(“%d, %d, %d, %d\n”, *(p+1), p[1], *(q+1), q[1]); Pointer variables and array variables can be used interchangeably. Why do we need to use pointer variables?

28 TRU-COMP2130 C Programming28 Do we really need to use pointers? Dynamic memory management #include void *malloc(int size); // allocate size bytes // and return the addr void free(void *); // free the memory space... int *p, n; scanf(“%d”, &n); // space for n-many integer variables. p = (int*)malloc(sizeof(int) * n); p[0] = 10; *(p+1) = 20; *(p+2) = 30; p++; *p = 4;

29 TRU-COMP2130 C: Advanced Topics29 Character Pointers #include gets(), puts() strcpy(), strlen(), strcmp(), strcat(),... toupper(),...

30 TRU-COMP2130 C Programming30 char name[256], tmp[256]; name[0] = ‘C’; name[1] = ‘O’; name[2] = ‘M’; name[3] = ‘P’; name[4] = ‘\0’;// it is very important. name[5] = ‘ ’; name[6] = ‘2’; name[7] = ‘1’; name[8] = ‘3’; name[9] = ‘0’; name[10] = ‘\0’; // it is very important. printf(“course number = %s\n”, name); printf(“%p\n”, name); printf(“course number = %s\n”, &(name[5])); scanf(“%s”, name);// not &name sprintf(tmp, “course name is %s.”, name);

31 TRU-COMP2130 C: Advanced Topics31 Pointer Arrays: Pointers to Pointers void f(int *x[13]); // 13 int* variables void f(int (*x)[13]); // pointer to an array of 13 ints // equivalent to int x[][13] Command-line arguments int main(int argc, char *argv[]); argcthe number of arguments argv[0]the program name, e.g., a.out argv[1]the first argument from the user E.g., $./a.out test this comp argc: 4 argv[0]: “./a.out” argv[1]: “test

32 TRU-COMP2130 C: Advanced Topics32 2. Structures User-defined data structure struct student_rcd {// class without methods in Java intstudent_number; charname[128];... };... struct student_rcd record[10], *rp; struct student_rcd test;// how to declare a struct variable test.student_number = 10;// how to access a member print_rcd(test); read_rcd(&test); record[0].student_number = 5; rp = (struct student_rcd *)malloc(sizeof(struct student_rcd) * 3); rp->student_number = 20; // Be careful with the “->” (*(rp+1)).student_number = 40; rp[2].student_number = 30;...

33 TRU-COMP2130 C: Advanced Topics33 void print_rcd(struct student_rcd rcd) { printf(“Number: %d\n”, rcd.student_number); printf(“Name: %s\n”, rcd.name); // name is an array. // not &(rcd.name) } void read_rcd(struct student_rcd *rcd) { printf(“Enter number: “); scanf(“%d”, &(rcd->student_number)); // reference rqd printf(“Enter name: “); scanf(“%s”, rcd->name); // name is an array. // not &(rcd->name) }

34 TRU-COMP2130 C: Advanced Topics34 Self-Referential Structures struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences */ struct tnode *left; /* left child */ struct tnode *right; /* right child */ struct tnode *parent; }; struct tnode root; root.left = (struct tnode *)malloc(...);

35 TRU-COMP2130 C: Advanced Topics35 Typedef typedef int Length; // Now Length is a data type. typedef char *String; // Now String is a data type. typedef struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences */ struct tnode *left, *right; /* children */ struct tnode *parent; } Treenode; // Now Treenode is a data type.... Length len, maxlen; Length *lengths[]; String p, lineptr[MAXLINES]; Treenodetnode; p = (String) malloc(100); // p[0],..., p[99]

36 TRU-COMP2130 C: Advanced Topics36 Example struct Student { char name[128]; int number; Student *next; }; typedef struct Student Student; Student *head = null; // important Student *new, *tmp; new = create_student(); // create a record, read data from the user, // store them into the record add_student(head, new); // add the new record at the end of the list tmp = find_student(head, 968374); // find the record whose number is.. printf(“%d: %s\n”, tmp->number, tmp->name); // print the record delete_student(head, 968374); Name Number next Name Number next Name Number next Head null

37 TRU-COMP2130 C: Advanced Topics37... create_student(... ) // create a record, read data from the user, { // store them into the record Student *new = (... )malloc(... ); scanf(“%s”,...) // read name scanf(“%d”,...) // read number new->next = null; // very important; (*new).next = null return...; };... add_student(... head,... new) // add the new record at the end of the list { Student *tmp; if (head == null) // when there is no record yet head = new; else { while((*tmp).next != null) // move to the last record tmp = (*tmp).next; // You cannot use array syntaxes (*tmp).next = new; // because the Student objects were not } // consecutively created. return; }

38 TRU-COMP2130 C: Advanced Topics38... find_student(... head,... no) // find the record { Student *tmp; tmp = head; while(tmp != null) { if ((... == no) break; tmp =...; }... delete_student(... head,... no) {... }

39 TRU-COMP2130 C: Advanced Topics39 Unions For polymorphism union u_tag { // the shared storage int ival; float fval; char *sval; }... int utype; union u_tag u;... u.ival = 20; if (utype == INT) printf("%d\n", u.ival); if (utype == FLOAT) printf("%f\n", u.fval); if (utype == STRING) printf("%s\n", u.sval); else printf("bad type %d in utype\n", utype);

40 TRU-COMP2130 C: Advanced Topics40 3. Input and Output Standard input from keyboard $ prog < infileinput redirection $ otherprog | progpipe int getchar() int putchar(int c)

41 TRU-COMP2130 C: Advanced Topics41 Formatted input int scanf (char *format, arg1, arg2,...)// from stdin int sscanf (char *string, char *format, arg1, arg2,...);// from string The arguments must be references.

42 TRU-COMP2130 C: Advanced Topics42 File Access #include FILE *in, *out; // FILE is defined in in = fopen(“in_filename”, “r”);// mode: r, w, a, r+, w+, a+ if (in == NULL)... out = fopen(“out_filename”, “w”); fclose(in); fprintf(out, “format...”, variables...); fscanf(...); fgets(...); int fseek(FILE*, long, SEEK_SET or SEEK_CURRENT or SEEK_END); // move file position pointer int fwrite(void*, int memb_size, int no_memb, FILE*); int fread(void*, int memb_size, int no_memb, FILE*);

43 TRU-COMP2130 C: Advanced Topics43 int fputc(int, FILE*); int fputcs(char*, FILE*); int fgetc(FILE*); int fscanf(FILE*, char* format,...); int fprintf(FILE*, char* format,...); Examples: A file copy program, using fopen(), fseek(), fwrite(), fread(), fclose(). Files containing student records struct student {... }; struct student record; FILE *fp = fopen(“test”, “w+”); // read and write; file truncated; fwrite(&record, sizeof(struct student), 1, fp); fread(&record, sizeof(struct student), 1, fp);

44 TRU-COMP2130 C: Advanced Topics44 How to obtain the current position:: long ftell(FILE*);

45 TRU-COMP2130 C: Advanced Topics45 Error Handling – Stderr and Exit fprintf(stderr, char*,...); exit(int);// non zero means error

46 TRU-COMP2130 C Programming46 math.h Some MATH related functions # include double sqrt(double); double pow(double, double); double fabs(double);... Link with –lm-lm means libm.a, that contains math utilities, is used $ gcc program3-5.c –lm


Download ppt "C: Advanced Topics Winter 2013 COMP 2130 Intro Computer Systems Computing Science Thompson Rivers University."

Similar presentations


Ads by Google