Fundamental of Programming (C)

Similar documents
typedef int Array[10]; String name; Array ages;

Structures and Unions in C. Alan L. Cox

Programming for Engineers Structures, Unions

Fundamentals of Programming. Lecture 12: C Structures, Unions, Bit Manipulations and Enumerations

OBJECT ORIENTED PROGRAMMING USING C++

Low-Level Programming in C

Introduction. Structures, Unions, Bit Manipulations, and Enumerations. Structure. Structure Definitions

C Structures, Unions, Bit Manipulations, and Enumerations

Chapter 10 C Structures, Unions, Bit Manipulations

Darshan Institute of Engineering & Technology for Diploma Studies Unit 5

Type Definition. C Types. Derived. Function Array Pointer Structure Union Enumerated. EE 1910 Winter 2017/18

공학프로그래밍언어 (PROGRAMMING LANGUAGE FOR ENGINEERS) -STRUCTURE- SPRING 2015 SEON-JU AHN, CNU EE

Fundamental of Programming (C)

Fundamentals of Programming Session 24

Everything Else C Programming and Software Tools. N.C. State Department of Computer Science

by: Lizawati, Norhidayah & Muhammad Noorazlan Shah Computer Engineering, FKEKK, UTeM

Pointers and Structure. Bin Li Assistant Professor Dept. of Electrical, Computer and Biomedical Engineering University of Rhode Island

Data Structures and Algorithms (DSA) Course 4. Iulian Năstac

ALQUDS University Department of Computer Engineering

Syntax and Variables

Dept. of Computer and Information Science (IDA) Linköpings universitet Sweden

CS349/SE382 A1 C Programming Tutorial

Fundamentals of Programming

Type Checking. Prof. James L. Frankel Harvard University

AIMMS Function Reference - Date Time Related Identifiers

BLM2031 Structured Programming. Zeyneb KURT

CS Programming I: Arrays

Programming. Structures, enums and unions

Recap. ANSI C Reserved Words C++ Multimedia Programming Lecture 2. Erwin M. Bakker Joachim Rijsdam

History. used in early Mac development notable systems in Pascal Skype TeX embedded systems

Structures and Union. Fall Jinkyu Jeong GEBD029: Basis and Practice in Programming Fall 2014 Jinkyu Jeong

14. Other Data Types. Compound Data Types: Defined data types (typedef) Unions typedef existing_type new_type_name ;

CS113: Lecture 3. Topics: Variables. Data types. Arithmetic and Bitwise Operators. Order of Evaluation

High Performance Computing

BBM#101# #Introduc/on#to# Programming#I# Fall$2013,$Lecture$12$

Computer Science & Information Technology (CS) Rank under AIR 100. Examination Oriented Theory, Practice Set Key concepts, Analysis & Summary

INFORMATION TECHNOLOGY SPREADSHEETS. Part 1

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 13, SPRING 2013

Structures and Pointers

Arrays and Pointers (part 2) Be extra careful with pointers!

IV Unit Second Part STRUCTURES

Computer System and programming in C

A Fast Review of C Essentials Part I

Laboratory 2: Programming Basics and Variables. Lecture notes: 1. A quick review of hello_comment.c 2. Some useful information

A class is a user-defined type. It is composed of built-in types, other user-defined types and

Variables Data types Variable I/O. C introduction. Variables. Variables 1 / 14

Introduction to C. Sean Ogden. Cornell CS 4411, August 30, Geared toward programmers

Fundamental of Programming (C)

Arrays and Pointers (part 2) Be extra careful with pointers!

C BOOTCAMP DAY 2. CS3600, Northeastern University. Alan Mislove. Slides adapted from Anandha Gopalan s CS132 course at Univ.

Structures, Unions Alignment, Padding, Bit Fields Access, Initialization Compound Literals Opaque Structures Summary. Structures

Introduction to C. Ayush Dubey. Cornell CS 4411, August 31, Geared toward programmers

EEE145 Computer Programming

CS3157: Advanced Programming. Announcement

C: How to Program. Week /Mar/05

Data Types and Variables in C language

Lecture 14. Dynamic Memory Allocation

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

Arrays III and Enumerated Types

Tokens, Expressions and Control Structures

Procedures, Parameters, Values and Variables. Steven R. Bagley

Input And Output of C++

Binghamton University. CS-211 Fall Syntax. What the Compiler needs to understand your program

Design and development of embedded systems for the Internet of Things (IoT) Fabio Angeletti Fabrizio Gattuso

Example. Section: PS 709 Examples of Calculations of Reduced Hours of Work Last Revised: February 2017 Last Reviewed: February 2017 Next Review:

3/22/2016. Pointer Basics. What is a pointer? C Language III. CMSC 313 Sections 01, 02. pointer = memory address + type

advanced data types (2) typedef. today advanced data types (3) enum. mon 23 sep 2002 defining your own types using typedef

10/20/2015. Midterm Topic Review. Pointer Basics. C Language III. CMSC 313 Sections 01, 02. Adapted from Richard Chang, CMSC 313 Spring 2013

Recursion Enums. Basics of Programming 1. Department of Networked Systems and Services G. Horváth, A.B. Nagy, Z. Zsóka, P. Fiala, A.

Programming in C. What is C?... What is C?

PROGRAMMAZIONE I A.A. 2017/2018

High Performance Computing in C and C++

Structures Unions and Enumerated Datatypes 224

CSE 230 Intermediate Programming in C and C++

C OVERVIEW. C Overview. Goals speed portability allow access to features of the architecture speed

C OVERVIEW BASIC C PROGRAM STRUCTURE. C Overview. Basic C Program Structure

12 CREATING NEW TYPES

Computer Systems Principles. C Pointers

UNIT-V. Structures. The general syntax of structure is given below: Struct <tagname> { datatype membername1; datatype membername2; };

Data Representation and Storage

CS240: Programming in C

Department of Computer Science and Engineering. Programming for Problem Solving. I Year B.Tech. (I - Sem) Assistant Professor (M.

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 13, FALL 2012

Data Representation and Storage. Some definitions (in C)

Main Program. C Programming Notes. #include <stdio.h> main() { printf( Hello ); } Comments: /* comment */ //comment. Dr. Karne Towson University

For each of the following variables named x, specify whether they are static, stack-dynamic, or heapdynamic:

Schedule/BACnet Schedule

CprE 288 Introduction to Embedded Systems Exam 1 Review. 1

C PROGRAMMING Lecture 4. 1st semester

Data Types. 9. Types. a collection of values and the definition of one or more operations that can be performed on those values

Complex data structures. Cedric Saule

Data Storage. August 9, Indiana University. Geoffrey Brown, Bryce Himebaugh 2015 August 9, / 19

Fundamental of Programming (C)

Kurt Schmidt. October 30, 2018

C Concepts - I/O. Lecture 19 COP 3014 Fall November 29, 2017

Programming in C. What is C?... What is C?

Programming in C UVic SEng 265

Conditional Formatting

Programming Logic and Design Sixth Edition

This is part of the book COMPUTER PROGRAMMING THE C LANGUAGE. by Adriana ALBU. Conspress Publisher, Bucureşti, România, 2013 ISBN:

Transcription:

Borrowed from lecturer notes by Omid Jafarinezhad Fundamental of Programming (C) Lecturer: Vahid Khodabakhshi Lecture 10 Structures, Unions, Bit Manipulations and Enumerations Department of Computer Engineering 1/38

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 Department of Computer Engineering 2

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; Department of Computer Engineering 3

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 in contrast to arrays that contain only elements of the same data type Structures are commonly used to define records to be stored in files Pointers and structures facilitate the formation of more complex data structures such as linked lists, queues, stacks and trees Structures are derived data types they are constructed using objects of other types Department of Computer Engineering 4

Declaring Structures (struct) 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; struct employee Ali, emp[10]; struct employee char firstname[ 20 ]; char lastname[ 20 ]; int age; char gender; double hourlysalary; } Ali, Sara, empdts[20]; struct employee Reza, *emp; struct char firstname[ 20 ]; char lastname[ 20 ]; int age; char gender; double hourlysalary; } Ali; Department of Computer Engineering 5

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; Department of Computer Engineering 6

Declaring Structures (struct) Members of the same structure type must have unique names, but two different structure types may contain members of the same name without conflict 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 ]; // OK int age; char gender; }; struct Student Ce40153[80]; Each structure definition must end with a semicolon Department of Computer Engineering 7

Declaring Structures (struct) A structure cannot contain an instance of itself 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 struct employee2 // double hourlysalary; struct employee2 person; /* ERROR */ struct employee2 *eptr; /* pointer */ }; A structure containing a member that is a pointer to the same structure type is referred to as a self-referential structure Department of Computer Engineering 8

Declaring Structures (struct) The structure tag name is optional struct char firstname[ 20 ]; char lastname[ 20 ]; int age; char gender; double hourlysalary; } Ali; 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 Department of Computer Engineering 9

Structure s sizeof 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]; printf("%d", sizeof(ali)); printf("%d", sizeof(emp)); printf("%d", sizeof(struct employee)); Department of Computer Engineering 10

Memory layout struct COST int amount; char currency_type[2]; } struct PART char id[2]; struct COST cost; int num_avail; } currency_type id amount num_avail cost Here, the system uses 4-byte alignment of integers, so amount and num_avail must be aligned Four bytes wasted for each structure! Department of Computer Engineering 11

Memory layout struct COST int amount; char currency_type[2]; } struct PART struct COST cost; char id[2]; int num_avail; } currency_type amount cost id num_avail Implementation dependent!!! Department of Computer Engineering 12

Accessing Struct Members Individual members of a struct variable may be accessed using the structure member operator (the dot, "."): myemp.firstname ; employee. firstname; // Error Or, if a pointer to the struct has been declared and initialized 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; Department of Computer Engineering 13

An Example - Initialization //Create a struct but don t reserve space struct personal long id; // student ID float gpa; // grade point average }; struct identity char FirstName[30]; char LastName[30]; unsigned age; struct personal person; }; struct identity js = "Joe", "Smith", 25}, *ptr = &js ; js.person.id = 123456789 ; js.person.gpa = 3.4 ; js.personal.id strcpy(js.firstname, = "Joe", "Smith","Joe"); 25, Error 9, 10} 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) ; Department of Computer Engineering 14

An Example - Assignment //Create a struct but don t reserve space struct personal long id; // student ID float gpa; // grade point average }; struct identity char FirstName[30]; char LastName[30]; unsigned age; struct personal person; }; 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) ; Department of Computer Engineering 15

Arrays of Structures //Create struct identity a struct sharifc40153[80] but don t reserve = "omid", space "Jafarinezhad", struct identity14, 9140153, 20, struct personal "Samad", "Shekarestani", 90, 2222222, 20} ; strcpy(sharifc40153[2].firstname, "Khaje Nezam"); char FirstName[30]; strcpy(sharifc40153[2].lastname, long id; // student ID "Shekarestani"); char LastName[30]; sharifc40153[2]. float gpa; age // = grade 100; point average unsigned age; }; sharifc40153[2]. person.id = 11111111; struct personal person; sharifc40153[2]. person. gpa = 20; } students[4]; FirstName LastName age id person gpa students[0] omid Jafarinezhad 14 9140153 20 Students[1] Samad Shekarestani 90 2222222 20 students[2] Khaje Nezam Shekarestani 100 11111111 20 students[3] Department of Computer Engineering 16

An Example #define NFRIENDS 10 struct Date unsigned year; unsigned month; unsigned day; }; struct Friend char FirstName[30]; char LastName[30]; struct Date Birthday; }; 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 typedef main() struct struct unsigned Friend year; friends[nfriends]; struct unsigned Date month; today = 2012, 3, 11}; // unsigned... day; } Date; for (i = 0; i < NFRIENDS; i++) bool check_birthday(date today, Date myfriend) if(check_birthday(today, friends[i].birthday)) // printf ("%s %s\n", friends[i].firstname, oj.lastname) ; } } //

Pointers to Structures Date create_date1(int month, void create_date2(date *d, int day, int month, int year) Date d; d.month = month; d.day = day; d.year = year; Pass-by-reference } int day, int year) d->month = month; d->day = day; d->year = year; } return (d); Date today; Copies date today = create_date1(9, 4, 2008); create_date2(&today, 9, 4, 2008); Department of Computer Engineering 18

Pointers to Structures void create_date2(date *d, int month, int day, int year) d->month = month; d->day = day; d->year = year; } 0x30A8 0x30A4 0x30A0 0x3098 year: 2008 day: 4 month: 9 d: 0x1000 void foo(void) Date today; create_date2(&today, 9, 4, 2008); 0x1008 0x1004 today.year: today.day: } 0x1000 today.month: 2008 4 9 Department of Computer Engineering 19

Pointers to Structures Date * create_date3(int month, int day, int year) Date *d; What is d pointing to?!?! d->month = month; d->day = day; d->year = year; } return (d); Department of Computer Engineering 20

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 Department of Computer Engineering 21

Compression of Structures Structures may not be compared using operators == and!=, because structure members are not necessarily stored in consecutive bytes of memory struct a int a; // OK int b; }; struct a b, c; b.a = 10; b.b = 30; c = b; if(c == b) // Error Department of Computer Engineering 22

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 are symbolic constants that take on integer values from zero through n. As an example, the statement: enum colors red, yellow, green } ; creates three constants. red is assigned the value 0, yellow is assigned 1 and green is assigned 2 Department of Computer Engineering 23

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 be set explicitly in the definition by assigning a value to the identifier 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 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 Department of Computer Engineering 24

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] ); Department of Computer Engineering 25

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] ); } Department of Computer Engineering 26

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 be relevant, but other variables are so a union shares the space instead 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 least enough to hold the largest member Only one member, and thus one data type, can be referenced at a time Department of Computer Engineering 27

Unions representation union mydataunion int i; char c; float f; } u1, u2; union mydataunion u3; f i c u1.i = 4; u1.c = a ; u2.i = 0xDEADBEEF; Department of Computer Engineering 28

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

Unions In a declaration, a union may be initialized with a value of the same type as the first union member union a int a; // OK char b[4]; }; union a b = 10}; printf("%d", b.a); Department of Computer Engineering 30

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

Tagged Unions Tag every value with its case enum Union_Tag IS_INT, IS_CHAR}; struct TaggedUnion enum Union_Tag tag; union int i; char c; } data; }; Enum must be external to struct, so constants are globally visible Struct field must be named Department of Computer Engineering 32

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 in the 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 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) Department of Computer Engineering 33

Bit-field Structures Notice that bit field members of structures are accessed exactly as any other structure member struct Flags int } foo; unsigned int unsigned int foo.f1 = -2; foo.f2 = 1; foo.f3 = 2; f1:3; f2:1; f3:2; f1 f2 f3 1 1 0 1 1 0 8 bit Padded to be an integral number of words Placement is compiler-specific 8 bit 8 bit Department of Computer Engineering 34

Unnamed Bit-field struct 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 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 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 Department of Computer Engineering 35

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 Department of Computer Engineering 36

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)... } Department of Computer Engineering 37

Notes of caution 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" Attempting to take the address of a bit field (the & operator may not be used with bit fields because they do not have addresses) 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 Department of Computer Engineering 38