STRUCTURES IN C
STRUCTURES struct Date { int month; int day; int year; }; • A structure is a key word that create user defined data type in C. • A structure creates a data type that can be used to group items of possibly different types into a single type. struct Date date;​ date.month = 2;​ date.day = 4;​ date.year = 2021;​
STRUCTURE REPRESENTATION & SIZE •sizeof(struct …) = sum of sizeof(field) + alignment padding Processor- and compiler-specific 62 61 EF BE AD DE c1 c2 i padding struct CharCharInt { char c1; char c2; int i; } foo; foo.c1 = ’a’; foo.c2 = ’b’; foo.i = 0xDEADBEEF; x86 uses “little-endian” representation
TYPEDEF • Mechanism for creating new type names • New names are an alias for some other type • May improve the portability and/or clarity of the program typedef long int64_t; typedef struct ADate { int month; int day; int year; } Date; int64_t i = 100000000000; Date d = { 2, 4, 2021 }; Overload existing type names for portability Simplify complex type names
CONSTANTS • Allow consistent use of the same constant throughout the program • Improves clarity of the program • Reduces likelihood of simple errors • Easier to update constants in the program int array[10]; for (i=0; i<10; i++) { … } #define SIZE 10 int array[SIZE]; for (i=0; i<SIZE; i++) { … } Preprocessor directive Constant names are capitalized by convention Define once, use throughout the program
ARRAYS OF STRUCTURES Date birthdays[NFRIENDS]; bool check_birthday(Date today) { int i; for (i = 0; i < NFRIENDS; i++) { if ((today.month == birthdays[i].month) && (today.day == birthdays[i].day)) return (true); return (false); } Constant Array declaration Array index, then structure field
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(2, 4, 2021); create_date2(&today, 2, 4, 2021);
POINTERS TO STRUCTURES void create_date2(Date *d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } void fun_with_dates(void) { Date today; create_date2(&today, 2, 4, 2021); } today.month: today.day: today.year: 0x1000 0x1004 0x1008 month: 2 day: 4 year: 2021 0x30A0 0x30A4 0x30A8 d: 0x1000 0x3098 2 4 2021
ABSTRACTION IN C struct widget; struct widget *widget_create(void); int widget_op(struct widget *widget, int operand); void widget_destroy(struct widget *widget); From the #include file widget.h: From the file widget.c: #include “widget.h” struct widget { int x; … }; Definition is hidden!
COLLECTIONS OF BOOLS (BIT VECTORS) • Byte, word, ... can represent many Booleans One per bit, e.g., 00100101 = false, false, true, ..., true • Bit-wise operations: Bit-wise AND: 00100101 & 10111100 == 00100100 Bit-wise OR: 00100101 | 10111100 == 10111101 Bit-wise NOT: ~ 00100101 == 11011010 Bit-wise XOR: 00100101 ^ 10111100 == 10011001
OPERATIONS ON BIT VECTORS const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 Always use C’s unsigned types for bit vectors A mask indicates which bit positions we are interested in 0…00 0101 == 0…01 0101 & 0…00 0111 important_bits = bit_vec & low_three_bits_mask; Selecting bits: Result = ?
OPERATIONS ON BIT VECTORS const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec |= low_three_bits_mask; Setting bits: 0…01 0111 == 0…01 0101 | 0…00 0111
OPERATIONS ON BIT VECTORS const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec &= ~low_three_bits_mask; Clearing bits: 0…01 0000 == 0…01 0101 & ~0…00 0111
BIT-FIELD STRUCTURES •Special syntax packs structure values more tightly. •Similar to bit vectors, but arguably easier to read •Nonetheless, bit vectors are more commonly used. •Padded to be an integral number of words •Placement is compiler-specific. 1 1 0 1 1 0 … … f1 f2 f3 struct Flags { int f1:3; unsigned int f2:1; unsigned int f3:2; } my_flags; my_flags.f1 = -2; my_flags.f2 = 1; my_flags.f3 = 2;

cprogramming Structures.pptx

  • 1.
  • 2.
    STRUCTURES struct Date { intmonth; int day; int year; }; • A structure is a key word that create user defined data type in C. • A structure creates a data type that can be used to group items of possibly different types into a single type. struct Date date;​ date.month = 2;​ date.day = 4;​ date.year = 2021;​
  • 3.
    STRUCTURE REPRESENTATION &SIZE •sizeof(struct …) = sum of sizeof(field) + alignment padding Processor- and compiler-specific 62 61 EF BE AD DE c1 c2 i padding struct CharCharInt { char c1; char c2; int i; } foo; foo.c1 = ’a’; foo.c2 = ’b’; foo.i = 0xDEADBEEF; x86 uses “little-endian” representation
  • 4.
    TYPEDEF • Mechanism forcreating new type names • New names are an alias for some other type • May improve the portability and/or clarity of the program typedef long int64_t; typedef struct ADate { int month; int day; int year; } Date; int64_t i = 100000000000; Date d = { 2, 4, 2021 }; Overload existing type names for portability Simplify complex type names
  • 5.
    CONSTANTS • Allow consistentuse of the same constant throughout the program • Improves clarity of the program • Reduces likelihood of simple errors • Easier to update constants in the program int array[10]; for (i=0; i<10; i++) { … } #define SIZE 10 int array[SIZE]; for (i=0; i<SIZE; i++) { … } Preprocessor directive Constant names are capitalized by convention Define once, use throughout the program
  • 6.
    ARRAYS OF STRUCTURES Datebirthdays[NFRIENDS]; bool check_birthday(Date today) { int i; for (i = 0; i < NFRIENDS; i++) { if ((today.month == birthdays[i].month) && (today.day == birthdays[i].day)) return (true); return (false); } Constant Array declaration Array index, then structure field
  • 7.
    POINTERS TO STRUCTURES Date create_date1(intmonth, 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(2, 4, 2021); create_date2(&today, 2, 4, 2021);
  • 8.
    POINTERS TO STRUCTURES void create_date2(Date*d, int month, int day, int year) { d->month = month; d->day = day; d->year = year; } void fun_with_dates(void) { Date today; create_date2(&today, 2, 4, 2021); } today.month: today.day: today.year: 0x1000 0x1004 0x1008 month: 2 day: 4 year: 2021 0x30A0 0x30A4 0x30A8 d: 0x1000 0x3098 2 4 2021
  • 9.
    ABSTRACTION IN C structwidget; struct widget *widget_create(void); int widget_op(struct widget *widget, int operand); void widget_destroy(struct widget *widget); From the #include file widget.h: From the file widget.c: #include “widget.h” struct widget { int x; … }; Definition is hidden!
  • 10.
    COLLECTIONS OF BOOLS(BIT VECTORS) • Byte, word, ... can represent many Booleans One per bit, e.g., 00100101 = false, false, true, ..., true • Bit-wise operations: Bit-wise AND: 00100101 & 10111100 == 00100100 Bit-wise OR: 00100101 | 10111100 == 10111101 Bit-wise NOT: ~ 00100101 == 11011010 Bit-wise XOR: 00100101 ^ 10111100 == 10011001
  • 11.
    OPERATIONS ON BITVECTORS const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 Always use C’s unsigned types for bit vectors A mask indicates which bit positions we are interested in 0…00 0101 == 0…01 0101 & 0…00 0111 important_bits = bit_vec & low_three_bits_mask; Selecting bits: Result = ?
  • 12.
    OPERATIONS ON BIT VECTORS constunsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec |= low_three_bits_mask; Setting bits: 0…01 0111 == 0…01 0101 | 0…00 0111
  • 13.
    OPERATIONS ON BITVECTORS const unsigned int low_three_bits_mask = 0x7; unsigned int bit_vec = 0x15; 0…00 0111 0…01 0101 bit_vec &= ~low_three_bits_mask; Clearing bits: 0…01 0000 == 0…01 0101 & ~0…00 0111
  • 14.
    BIT-FIELD STRUCTURES •Special syntaxpacks structure values more tightly. •Similar to bit vectors, but arguably easier to read •Nonetheless, bit vectors are more commonly used. •Padded to be an integral number of words •Placement is compiler-specific. 1 1 0 1 1 0 … … f1 f2 f3 struct Flags { int f1:3; unsigned int f2:1; unsigned int f3:2; } my_flags; my_flags.f1 = -2; my_flags.f2 = 1; my_flags.f3 = 2;