Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecturer: Omid Jafarinezhad Sharif University of Technology Department of Computer Engineering 1 Fundamental of Programming (C) Lecture 8 Structures, Unions,

Similar presentations


Presentation on theme: "Lecturer: Omid Jafarinezhad Sharif University of Technology Department of Computer Engineering 1 Fundamental of Programming (C) Lecture 8 Structures, Unions,"— Presentation transcript:

1 Lecturer: Omid Jafarinezhad Sharif University of Technology Department of Computer Engineering 1 Fundamental of Programming (C) Lecture 8 Structures, Unions, Bit Manipulations and Enumerations

2 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 2 Outline Structures – Be able to use compound data structures in programs Unions – Be able to share storage space of their members Bit fields Structures – Be able to do simple bit-vector manipulations Enumerations – Be able to use compound symbolic constants

3 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 3 User Defined Data Types (typedef) synonyms The C language provides a facility called typedef for creating synonyms for previously defined data type names. For example, the declaration: typedef int Length; Length synonymaliasint makes the name Length a synonym (or alias) for the data type int. The data type name Length can now be used in declarations in exactly the same way that the data type int can be used: Length Length a, b, len ; Length Length numbers[10] ; typedef typedef char String[50]; typedef typedef int Array[10]; String String name; Array Array ages;

4 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 4 Structures (struct) Structuresaggregates Structures—sometimes referred to as aggregates—are collections of related variables under one name Structures different data types arrays same data type Structures may contain variables of many different data types—in contrast to arrays that contain only elements of the same data type Structuresrecords files Structures are commonly used to define records to be stored in files Pointersstructures linked listsqueuesstacks trees Pointers and structures facilitate the formation of more complex data structures such as linked lists, queues, stacks and trees derived data types Structures are derived data types—they are constructed using objects of other types

5 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 5 Declaring Structures (struct) structure tag The name "employee" is called a structure tag Variables declared within the braces of the structure definition are the structure’s members struct employee { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; ; } Ali, Sara, empDTS[20]; struct employee Reza, *emp; struct employee { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; ; }; struct employee Ali, emp[10];struct { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; ; } Ali;

6 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 6 Declaring Structures (struct) typedef struct Often, typedef is used in combination with struct to declare a synonym (or an alias) for a structure: typedef struct { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; ; } employee ; /* The "alias" employee employee Ali; /* Create a struct variable */ struct employee { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; ; } Ali, Sara, empDTS[20]; struct employee Reza, *emp;

7 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 7 Declaring Structures (struct) Members must have unique namestwo different structure may contain members of the same name Members of the same structure type must have unique names, but two different structure types may contain members of the same name without conflict Each structure definition must end with a semicolon struct employee // Error!!! { char Name[ 20 ]; char Name[ 20 ]; // Error!!! int age; char gender; double hourlySalary; } Ali, Sara, empDTS[20]; struct employee Reza, *emp; struct Student // OK { char Name[ 20 ]; // OK int age; char gender; }; struct Student Ce40153[80];

8 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 8 Declaring Structures (struct) cannot contain an instance of itself A structure cannot contain an instance of itself A pointer to struct employee, however, may be included For example, a variable of type struct employee cannot be declared in the definition for struct employee A pointer to struct employee, however, may be included self-referential structure A structure containing a member that is a pointer to the same structure type is referred to as a self-referential structure struct employee2 person; /* ERROR */ struct employee2 *ePtr; /* pointer */ struct employee2 { // … double hourlySalary; struct employee2 person; /* ERROR */ struct employee2 *ePtr; /* pointer */ };

9 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 9 Declaring Structures (struct) The structure tag name is optional does not contain a structure tag variables of the structure type may be declared only in the structure definition—not in a separate declaration If a structure definition does not contain a structure tag name, variables of the structure type may be declared only in the structure definition—not in a separate declaration struct { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; } Ali;

10 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 10 Structure’s sizeof Structure definitions do not reserve any space in memory Structure definitions do not reserve any space in memory; rather, each definition creates a new data type that is used to define variables sizeof(struct …) = sum of sizeof(members) + alignment padding (Processor- and compiler-specific) struct employee { char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary; }; struct employee Ali, emp[10]; sizeof(Ali) printf("%d", sizeof(Ali)); sizeof(emp) printf("%d", sizeof(emp)); sizeof(struct employee) printf("%d", sizeof(struct employee));

11 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 11 Memory layout struct COST { int amount; char currency_type[2]; } struct PART { char id[2]; struct COST cost; int num_avail; } Here, the system uses 4-byte alignment of integers, so amount and num_avail must be aligned Four bytes wasted for each structure! idamountnum_avail cost currency_type

12 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 12 Memory layout struct COST { int amount; char currency_type[2]; } struct PART { struct COST cost; char id[2]; int num_avail; } Implementation dependent!!! id amount num_avail cost currency_type

13 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 13 Accessing Struct Members members member operator dot Individual members of a struct variable may be accessed using the structure member operator (the dot, "."): myEmp.firstName ; employee. firstName// Error employee. firstName; // Error Or, if a pointer to the struct has been declared and initialized employee *emp = &myEmp ; pointer operator – by using the structure pointer operator : ->arrow operator emp -> firstName; // arrow operator – which could also be written as: (*). (* emp).firstName; struct employee { char firstName[ 20 ]; // … myEmp } myEmp ;

14 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 14 An Example - Initialization js = {"Joe", "Smith", 25} struct identity js = {"Joe", "Smith", 25}, *ptr = &js ; js.person.id = 123456789 ; js.person.gpa = 3.4 ; printf ("%s %s %d %ld %f\n", js.FirstName, js.LastName, js.age, js.person.id, js.person.gpa) ; printf ("%s %s %d %ld %f\n", ptr->FirstName, ptr->LastName,ptr->age, ptr->person.id, ptr->person.gpa) ; struct identity { char FirstName[30]; char LastName[30]; unsigned age; struct personal person; }; //Create a struct but don’t reserve space struct personal { long id; // student ID float gpa; // grade point average }; js = {"Joe", "Smith", 25, 9, 10} personal Error js. personal.id Error strcpy("Joe"); strcpy(js.FirstName, "Joe");

15 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 15 An Example - Assignment js = {"Joe", "Smith", 25} struct identity js = {"Joe", "Smith", 25}, oj ; js.person.id = 123456789 ; js.person.gpa = 3.4 ; oj = js; printf ("%s %s %d %ld %f\n", oj.FirstName, oj.LastName, oj.age, js.person.id, oj.person.gpa) ; printf ("%s %s %d %ld %f\n", ptr->FirstName, ptr->LastName,ptr->age, ptr->person.id, ptr->person.gpa) ; struct identity { char FirstName[30]; char LastName[30]; unsigned age; struct personal person; }; //Create a struct but don’t reserve space struct personal { long id; // student ID float gpa; // grade point average };

16 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 16 Arrays of Structures struct identity { char FirstName[30]; char LastName[30]; unsigned age; struct personal person; } students[4]; //Create a struct but don’t reserve space struct personal { long id; // student ID float gpa; // grade point average }; sharifC40153[80] = {"omid", "Jafarinezhad", 14, 9140153, 20, struct identity sharifC40153[80] = {"omid", "Jafarinezhad", 14, 9140153, 20, "Samad", "Shekarestani", 90, 2222222, 20} "Samad", "Shekarestani", 90, 2222222, 20} ; strcpy(sharifC40153[2]."Khaje Nezam" strcpy(sharifC40153[2].FirstName, "Khaje Nezam"); strcpy(sharifC40153[2]."Shekarestani" strcpy(sharifC40153[2].LastName, "Shekarestani"); sharifC40153[2]. sharifC40153[2]. age = 100; sharifC40153[2]. sharifC40153[2]. person.id = 11111111; sharifC40153[2]. sharifC40153[2]. person. gpa = 20;

17 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 17 bool check_birthday(struct Date today, struct Date myFriend) { if ((today.month == myFriend.month) && (today.day == myFriend.day)) return (true); return (false); } int main() { struct Friend friends[NFRIENDS]; struct Date today = {2012, 3, 11}; //... for (i = 0; i < NFRIENDS; i++) { todayfriends[i].Birthday if(check_birthday(today, friends[i].Birthday)) printf ("%s %s\n", friends[i].FirstName, oj.LastName) ; } // … An Example #define NFRIENDS 10 struct Date { unsigned year; unsigned month; unsigned day; }; struct Friend { char FirstName[30]; char LastName[30]; struct Date Birthday; }; typedef struct { unsigned year; unsigned month; unsigned day; } Date; bool check_birthday(Date today, Date myFriend) { //… }

18 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 18 Pointers to Structures Date create_date1(int month, int day, int year) { Date d; d.month = month; d.day = day; d.year = year; return (d); } void create_date2(Date *d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } Copies date Pass-by-reference Date today; today = create_date1(9, 4, 2008); create_date2(&today, 9, 4, 2008);

19 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 19 Pointers to Structures void create_date2(Date *d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } void foo(void) { Date today; create_date2(&today, 9, 4, 2008); } today.month: today.day: today.year: 0x1000 0x1004 0x1008 month: 9 day: 4 year: 2008 0x30A0 0x30A4 0x30A8 d: 0x1000 0x3098 9 4 2008

20 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 20 Pointers to Structures Date * create_date3(int month, int day, int year) { Date *d; d->month = month; d->day = day; d->year = year; return (d); } What is d pointing to?!?!

21 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 21 Pointers to Structures void changeByValue(Date date) { date.day ++; } void changeByRef(Date *date) { date->day++; } void printDate(const Date date) { printf("today(d/m/y) is : \n"); printf("%d/%d/%d\n", date.day, date.month, date.year); } Date today = {2012, 3, 11}; printDate(today); changeByValue(today); printDate(today); changeByRef(&today); printDate(today); today(d/m/y) is : 11/3/2012 today(d/m/y) is : 11/3/2012 today(d/m/y) is : 12/3/2012

22 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 22 Compression of Structures may not be compared using operators == and != Structures may not be compared using operators == and !=, because structure members are not necessarily stored in consecutive bytes of memory struct a { // OK int a; // OK int b; }; struct a b, c; b.a = 10; b.b = 30; c = b; // Error if(c == b) // Error

23 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 23 Enumeration enum Enumeration is a user-defined data type. It is defined using the keyword enum and the syntax is: enum {name_0, …, name_n} ; enum tag_name {name_0, …, name_n} ; tag_name is not used directly The tag_name is not used directly. The names in the braces are symbolic constants that take on integer values from zero through n. As an example, the statement: enum colors { red, yellow, green } ; enum colors { red, yellow, green } ; – creates three constants. red is assigned the value 0, yellow is assigned 1 and green is assigned 2

24 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 24 Enumeration start with 0, unless specified otherwise Values in an enum start with 0, unless specified otherwise, and are incremented by 1 identifiers must be unique The identifiers in an enumeration must be unique enumeration constantcan be set explicitly The value of each enumeration constant of an enumeration can be set explicitly in the definition by assigning a value to the identifier Multiple members of an enumeration can have the same constant value Multiple members of an enumeration can have the same constant value Assigning a value to an enumeration constant after it has been defined is a syntax error Assigning a value to an enumeration constant after it has been defined is a syntax error Use only uppercase letters enumeration constant names. This makes these constants stand out in a program and reminds you that enumeration constants are not variables

25 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 25 An Example /* This program uses enumerated data types to access the elements of an array */ #include int main( ) { int March[5][7]={{0,0,1,2,3,4,5}, {6,7,8,9,10,11,12}, {13,14,15,16,17,18,19}, {20,21,22,23,24,25,26}, {27,28,29,30,31,0,0}}; enum days {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; enum week {week_one, week_two, week_three, week_four, week_five}; printf ("Monday the third week of March is March %d\n", March [week_three] [Monday] ); }

26 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 26 An Example /* enumeration constants represent months of the year */ enum months {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }; enum months month; /* initialize array of pointers */ const char *monthName[] = { "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", /* loop through months */ for (month = JAN; month <= DEC; month++ ) { printf( "%2d%11s\n", month, monthName[month] ); }

27 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 27 Unions derived data type share the same storage space A union is a derived data type—like a structure—with members that share the same storage space For different situations in a program, some variables may not be relevant, but other variables are—so a union shares the space instead of wasting storage on variables that are not being used any data type The members of a union can be of any data type be at least enough to hold the largest member The number of bytes used to store a union must be at least enough to hold the largest member Only one memberat a time Only one member, and thus one data type, can be referenced at a time

28 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 28 Unions representation union myDataUnion { int i; char c; float f; } u1, u2; union myDataUnion u3; u1.i = 4; u1.c = ’a’; u2.i = 0xDEADBEEF; c i f

29 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 29 Unions The operations that can be performed on a union are the following: – assigning same type – assigning a union to another union of the same type – taking the address – taking the address (&) of a union variable member operatorpointer operator – accessing union members using the structure member operator and the structure pointer operator may not be compared using operators == and != Unions may not be compared using operators == and != for the same reasons that structures cannot be compared

30 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 30 Unions the first union member In a declaration, a union may be initialized with a value of the same type as the first union member union a { // OK int a; // OK char b[4]; }; union a b = {10}; printf("%d", b.a);

31 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 31 Unions A union value doesn’t "know" which case it contains union AnElt { int i; char c; } elt1, elt2; elt1.i = 4; elt2.c = ’a’; elt2.i = 0xDEADBEEF; if (elt1 currently has a char) … How should your program keep track whether elt1, elt2 hold an int or a char? Basic answer: Another variable holds that info

32 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 32 enum Union_Tag {IS_INT, IS_CHAR}; struct TaggedUnion { enum Union_Tag tag; union { int i; char c; } data; }; Tagged Unions Tag every value with its case Enum must be external to struct, so constants are globally visible Struct field must be named

33 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 33 Bit-field Structures the number of bitsunsigned or int member a structure or union C enables you to specify the number of bits in which an unsigned or int member of a structure or union is stored a bit field This is referred to as a bit field better memory utilization Bit fields enable better memory utilization by storing data in the minimum number of bits required int or unsigned Bit field members must be declared as int or unsigned declared by following an unsigned or int member name with a colon (:) and an integer constant representing the width of the field A bit field is declared by following an unsigned or int member name with a colon (:) and an integer constant representing the width of the field (i.e., the number of bits in which the member is stored)

34 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 34 Bit-field Structures Notice that bit field members of structures are accessed exactly as any other structure member Padded to be an integral number of words – Placement is compiler-specific struct Flags { int f1:3; unsigned int f2:1; unsigned int f3:2; } foo; foo.f1 = -2; foo.f2 = 1; foo.f3 = 2; 110110…… f1f2f3

35 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 35 Unnamed Bit-field struct example { unsigned a : 13; unsigned : 19; unsigned : 19; unsigned b : 4; }; 19-bit field as padding—nothing can be stored in those 19 bits uses an unnamed 19-bit field as padding—nothing can be stored in those 19 bits unnamed bit field with a zero widthto align the next bit field on a new storage An unnamed bit field with a zero width is used to align the next bit field on a new storage-unit boundary For example, the structure definition unsigned : 0; struct example { unsigned a : 13; unsigned : 0; unsigned b : 4; }; uses an unnamed 0-bit field to skip the remaining bits (as many as there are) of the storage unit in which a is stored and to align b on the next storage-unit boundary

36 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 36 An Example - disk drive controller Frequently device controllers (e.g. disk drives) and the operating system need to communicate at a low level. Device controllers contain several registers which may be packed together in one integer

37 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 37 An Example - disk drive controller struct DISK_REGISTER { unsigned ready:1; unsigned error_occured:1; unsigned disk_spinning:1; unsigned write_protect:1; unsigned head_loaded:1; unsigned error_code:8; unsigned track:9; unsigned sector:5; unsigned command:5; }; struct DISK_REGISTER *disk_reg = (struct DISK_REGISTER *) DISK_REGISTER_MEMORY; /* Define sector and track to start read */ disk_reg->sector = new_sector; disk_reg->track = new_track; disk_reg->command = READ; /* wait until operation done, ready will be true */ while ( ! disk_reg->ready ) ; /* check for errors */ if (disk_reg->error_occured) { /* interrogate disk_reg->error_code for error type */ switch (disk_reg->error_code)...... }

38 Structures, Unions, Bit Manipulations and Enumerations – Lecture 9 Sharif University of Technology Department of Computer Engineering 38 Notes of caution machine dependent Bit-field manipulations are machine dependent Attempting to access individual bits of a bit field as if they were elements of an array is a syntax error. Bit fields are not "arrays of bits" & operator may not be used with bit fields Attempting to take the address of a bit field (the & operator may not be used with bit fields because they do not have addresses) slower-executing machine-language code Although bit fields save space, using them can cause the compiler to generate slower-executing machine-language code. This occurs because it takes extra machine language operations to access only portions of an addressable storage unit. This is one of many examples of the kinds of space–time trade-offs that occur in computer science


Download ppt "Lecturer: Omid Jafarinezhad Sharif University of Technology Department of Computer Engineering 1 Fundamental of Programming (C) Lecture 8 Structures, Unions,"

Similar presentations


Ads by Google