fundamental of programming (c)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · students[1]...

32
Fundamentals of Programming Sharif University of Technology Lecture 9 - Structures, Unions, Bit Manipulations and Enumerations Lecturer : Ebrahim Jahandar Borrowed from lecturer notes by Omid Jafarinezhad Fundamental of Programming (C)

Upload: others

Post on 21-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Fundamentals of Programming

Sharif University of Technology

Lecture 9 - Structures, Unions, Bit Manipulations and Enumerations

Lecturer : Ebrahim JahandarBorrowed from lecturer notes by Omid Jafarinezhad

Fundamental of Programming (C)

Page 2: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology2

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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

Page 3: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology3

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

User Defined Data Types (typedef)• The C language provides a facility called typedef for creating synonyms

for previously defined data type names.• For example, the declaration:

typedef int Length;

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 a, b, len ;Length numbers[10] ;typedef char String[50];typedef int Array[10];String name;Array ages;

Page 4: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology4

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Structures (struct) • Structures—sometimes referred to as aggregates, are collections of

related variables under one name

• Structures may contain variables of many different data types incontrast to arrays that contain only elements of the same data type

• Pointers and structures facilitate the formation of more complex datastructures such as linked lists, queues, stacks and trees

• Structures are derived data types—they are constructed using objectsof other types

Page 5: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology5

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Declaring Structures (struct)

• The name "employee" is called a structure tag

• Variables declared within the braces of the structuredefinition 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;

Page 6: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology6

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Declaring Structures (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 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;

Page 7: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology7

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Declaring Structures (struct)• Members of the same structure type must have unique names,

but two different structure types may contain members ofthe same name without conflict

• Each structure definition must end with a semicolon

struct employee

{char Name[ 20 ];char Name[ 20 ]; // Error!!!int age;char gender;double hourlySalary;

} Ali, Sara, empDTS[20];

struct employee Reza, *emp;

struct Student

{char Name[ 20 ]; // OKint age;char gender;

};

struct Student Ce40153[80];

Page 8: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology8

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Declaring Structures (struct)• A structure cannot contain an instance of itself

• For example, a variable of type struct employee cannot bedeclared in the definition for struct employee A pointer tostruct employee, however, may be included

• A structure containing a member that is a pointer to the samestructure type is referred to as a self-referential structure

struct employee2 {// …double hourlySalary; struct employee2 person; /* ERROR */struct employee2 *ePtr; /* pointer */

};

Page 9: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology9

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Declaring Structures (struct)• The structure tag name is optional

• If a structure definition does not contain a structure tag name,variables of the structure type may be declared only in thestructure definition—not in a separate declaration

struct

{char firstName[ 20 ];char lastName[ 20 ];int age;char gender;double hourlySalary;

} Ali;

Page 10: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology10

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Structure’s sizeof

• Structure definitions do not reserve any space inmemory; rather, each definition creates a new data typethat 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];printf("%d", sizeof(Ali));printf("%d", sizeof(emp));printf("%d", sizeof(struct employee));

Page 11: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology11

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Accessing Struct Members

• Individual members of a struct variable may be accessedusing the structure member operator (the dot, "."):

myEmp.firstName ;

employee. firstName; // Error

• Or , if a pointer to the struct has been declared andinitialized

employee *emp = &myEmp ;– by using the structure pointer operator :

emp -> firstName; // arrow operator

– which could also be written as:

(* emp).firstName;

struct employee{

char firstName[ 20 ];// …

} myEmp;

Page 12: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology12

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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 spacestruct personal{

long id; // student IDfloat gpa; // grade point average

};

Page 13: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology13

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Arrays of Structuresperson

ageLastNameFirstNamegpaid

20914015314Jafarinezhadomidstudents[0]

20222222290ShekarestaniSamadStudents[1]

2011111111100ShekarestaniKhaje Nezamstudents[2]

students[3]

struct identity sharifC40153[80] = {"omid", "Jafarinezhad", 14, 9140153, 20,"Samad", "Shekarestani", 90, 2222222, 20} ;

strcpy(sharifC40153[2].FirstName, "Khaje Nezam");strcpy(sharifC40153[2].LastName, "Shekarestani");sharifC40153[2]. age = 100;sharifC40153[2]. person.id = 11111111;sharifC40153[2]. person. gpa = 20;

Page 14: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology14

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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++) {

if(check_birthday(today, friends[i].Birthday))printf ("%s %s\n", friends[i].FirstName, oj.LastName) ;

} // …

An Example#define NFRIENDS 10struct 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){

//…}

Page 15: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology15

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Pointers to StructuresDate 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);

Page 16: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology16

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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?!?!

Page 17: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology17

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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/2012today(d/m/y) is :11/3/2012today(d/m/y) is :12/3/2012

Page 18: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology18

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Compression of Structures

• Structures may not be compared using operators ==and !=, because structure members are not necessarilystored in consecutive bytes of memory

struct a {int a; // OKint b;

};struct a b, c;b.a = 10;b.b = 30;c = b;if(c == b) // Error

Page 19: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology19

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Enumeration• Enumeration is a user-defined data type. It is defined using the

keyword enum and the syntax is:

enum tag_name {name_0, …, name_n} ;

• The tag_name is not used directly. The names in the braces aresymbolic constants that take on integer values from zerothrough n. As an example, the statement:

enum colors { red, yellow, green } ;

– creates three constants. red is assigned the value 0, yellow is assigned 1and green is assigned 2

Page 20: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology20

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Enumeration• Values in an enum start with 0, unless specified otherwise, and are

incremented by 1

• The identifiers in an enumeration must be unique

• The value of each enumeration constant of an enumeration can beset explicitly in the definition by assigning a value to the identifier

• Multiple members of an enumeration can have the same constantvalue

• Assigning a value to an enumeration constant after it has beendefined is a syntax error

• Use only uppercase letters enumeration constant names. This makesthese constants stand out in a program and reminds you thatenumeration constants are not variables

Page 21: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology21

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

An Example/* This program uses enumerated data types to access the elements of an array */#include <stdio.h>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] );

}

Page 22: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology22

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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] );}

Page 23: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology23

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Unions• 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 berelevant, but other variables are—so a union shares the spaceinstead of wasting storage on variables that are not being used

• The members of a union can be of any data type

• The number of bytes used to store a union must be at leastenough to hold the largest member

• Only one member, and thus one data type, can be referenced ata time

Page 24: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology24

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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

Page 25: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology25

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Unions

• The operations that can be performed on a union are thefollowing:– assigning a union to another union of the same type

– taking the address (&) of a union variable

– accessing union members using the structure member operatorand the structure pointer operator

• Unions may not be compared using operators == and !=for the same reasons that structures cannot be compared

Page 26: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology26

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Unions

• In a declaration, a union may be initialized with a value ofthe same type as the first union member

union a {

int a; // OKchar b[4];

};

union a b = {10};printf("%d", b.a);

Page 27: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology27

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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

Page 28: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology28

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

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

Page 29: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology29

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Bit-field Structures• C enables you to specify the number of bits in which an

unsigned or int member of a structure or union is stored

• This is referred to as a bit field

• Bit fields enable better memory utilization by storing data inthe minimum number of bits required

• Bit field members must be declared as int or unsigned

• A bit field is declared by following an unsigned or intmember name with a colon (:) and an integer constantrepresenting the width of the field (i.e., the number of bits inwhich the member is stored)

Page 30: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology30

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

…8 bit ……8 bit ……8 bit …

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;

1 1 0 1 1 0 … …

f1 f2 f3

Page 31: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology31

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Unnamed Bit-fieldstruct example {

unsigned a : 13;

unsigned : 19;

unsigned b : 4;

};

• uses an unnamed 19-bit field as padding, nothing can be stored in those 19 bits

Page 32: Fundamental of Programming (C)ce.sharif.edu/courses/95-96/1/ce153-12/resources... · Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111

Sharif University of Technology32

Structures, Unions, Bit Manipulations and Enumerations – Lecture 9

Notes of caution• Bit-field manipulations are machine dependent

• Attempting to access individual bits of a bit field as if they wereelements of an array is a syntax error. Bit fields are not "arrays of bits"

• Attempting to take the address of a bit field (the & operator may notbe used with bit fields because they do not have addresses)

• Although bit fields save space, using them can cause the compiler togenerate slower-executing machine-language code. This occursbecause it takes extra machine language operations to access onlyportions of an addressable storage unit. This is one of many examplesof the kinds of space–time trade-offs that occur in computer science