C programming/Structures

From Teknologisk videncenter
Jump to: navigation, search

Basic structrues

Example 1

Create and instantiate a structure

#include <stdio.h>
#include <stdlib.h>

struct coor {
  int x;
  int y;
};

int main( void ) {
  struct coor place;
  
  place.x = 17;
  place.y = 19;
  
  printf("Tallet er %i\n",place.x+place.y);
  return(0);
}

Example 2

Same as example 1, but using as typedef

#include <stdio.h>
#include <stdlib.h>

struct coor {
  int x;
  int y;
};

typedef struct coor coordinate;
int main( void ) {
  coordinate place;
  
  place.x = 17;
  place.y = 19;
  
  printf("Tallet er %i\n",place.x+place.y);
  return(0);
}


Example 3

In example 3 the memory is reserver with malloc and indirect addressing is used to access the structure.

#include <stdio.h>
#include <stdlib.h>

struct coor {
  int x;
  int y;
};

typedef struct coor coordinate;
int main( void ) {
  coordinate *place = malloc( sizeof( coordinate ) );

  (*place).x = 17;  /* One form of indirect addressing shown */
  place->y = 19;     /* Another form of indirect addressing shown */

  printf("Tallet er %i\n",place->x + place->y);
  free( place ); /* Always remember to free allocated memory (Good habbit)*/
  return( 0 );
}

Structures in function calls

There are two options when using structures in function calls:

  1. Transfer the address of the pointer in memory to the function ( A pointer to the original structure)
  2. Transfer a copy of the structure to the function.

Using a pointer

In this example the address in memory (the pointer) to t is transferred to adjustTimezone. The function changes the timezone of the original t as expected.

#include <stdio.h>

#define TIMEZONE 1      // TIMEZONE from GMT in hours 
struct TimeStruct {     // Declare structure TimeStruct
        int     sec;        // seconds              00 to 59
        int     min;        // minutes              00 to 59
        int     hour;       // hours                00 to 23
        int     mday;       // day of the month     1 to 31
        int     mon;        // month                1 to 12
        int     year;       // year                 1970 to 2106
};

adjustTimezone( struct TimeStruct *t ) {
    t->hour += TIMEZONE;   // Add TIMEZONE hours -> means via pointer
    //Code to check if t->hour < 0 or > 23
}  

int main( void ) {
    struct TimeStruct t;  // Define struct t as type TimeStruct

    // Initialize time to time 00:00:00 date 1. january 1970 
    t.sec  = 0;
    t.min  = 0;
    t.hour = 0;
    t.mday = 1;
    t.mon  = 1;
    t.year = 1970;

    adjustTimzone( &t );
    printf("The time is %02i:%02i:%02i\n", t.hour, t.min, t.sec);  //Will print 00:01:00 in this example
}

Using a copy

In this example a copy of t is transferred to adjustTimezone. the function adjustTimezone will change the timezone of the copy and not the original t. The copy of t is deleted when adjustTimezone returns. Nothing happens to t.

#include <stdio.h>

#define TIMEZONE 1      // TIMEZONE from GMT in hours 
struct TimeStruct {     // Declare structure TimeStruct
        int     sec;        // seconds              00 to 59
        int     min;        // minutes              00 to 59
        int     hour;       // hours                00 to 23
        int     mday;       // day of the month     1 to 31
        int     mon;        // month                1 to 12
        int     year;       // year                 1970 to 2106
};

adjustTimezone( struct TimeStruct t ) {
    t.hour += TIMEZONE;   // Add TIMEZONE hours to the copy!!
    //The copy is deleted when this function returns
}  

int main( void ) {
    struct TimeStruct t;  // Define struct t as type TimeStruct

    // Initialize time to time 00:00:00 date 1. january 1970 
    t.sec  = 0;
    t.min  = 0;
    t.hour = 0;
    t.mday = 1;
    t.mon  = 1;
    t.year = 1970;

    adjustTimzone( t );
    printf("The time is %02i:%02i:%02i\n", t.hour, t.min, t.sec);  //Will WRONGLY print 00:00:00 in this example
}

Arrays of structures example

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STUDENTS 16
#define FREE 0
#define POPULATE(FIELD, ID, NAME, SURNAME) class[FIELD].id = ID, \
                                          strcpy(class[FIELD].name,NAME), \
                                          strcpy(class[FIELD].surname,SURNAME)


struct person {
    int id;
    char name[25];
    char surname[25];
};

typedef struct person p;

int main( void ) {
    p class[ STUDENTS ];
        /* Initialize p*/
    int i;
    for ( i = 0; i < STUDENTS ; i++ ) {
        class[i].id = FREE;  /* 0 = No student allocated */
    }

    /* Populate class */
    class[0].id = 101; strcpy(class[0].name,"Henrik"); strcpy(class[0].surname,"Thomsen");
    class[7].id = 145; strcpy(class[7].name,"Anders"); strcpy(class[7].surname,"And");
    POPULATE(3,78,"Kaptajn","Haddock"); /* using macro POPULATE (Just for fun)*/


        /* Parse structure and print populated students */
    for ( i = 0; i < STUDENTS ; i++ ) {
        if ( class[i].id != FREE ) {
                printf("Student: ID: %i name: %s %s\n",class[i].id, class[i].name, class[i].surname);
                fflush(stdout); /* Empty buffer to stdout (Just for fun) */
        }
    }
}

Typedef simple

typedef struct {
  int k;
  float f;
} MYSTR;

MYSTR const mine = { 7, 4.4};