Difference between revisions of "C programming/Structures"
From Teknologisk videncenter
m (→Structures in function calls) |
m (→Typedef simple) |
||
(5 intermediate revisions by the same user not shown) | |||
Line 72: | Line 72: | ||
</source> | </source> | ||
=Structures in function calls= | =Structures in function calls= | ||
− | + | There are two options when using structures in function calls: | |
+ | # Transfer the address of the pointer in memory to the function ( A pointer to the original structure) | ||
+ | # 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. | ||
<source lang=c> | <source lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Line 103: | Line 107: | ||
adjustTimzone( &t ); | adjustTimzone( &t ); | ||
− | printf("The time is %02i:%02i:02i\n", t.hour, t.min, .t.sec); //Will print 00: | + | printf("The time is %02i:%02i:%02i\n", t.hour, t.min, t.sec); //Will print 00:01:00 in this example |
+ | } | ||
+ | </source> | ||
+ | ==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'''. | ||
+ | <source lang=c> | ||
+ | #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 | ||
} | } | ||
</source> | </source> | ||
Line 149: | Line 188: | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | =Typedef simple= | ||
+ | <Source lang=c> | ||
+ | typedef struct { | ||
+ | int k; | ||
+ | float f; | ||
+ | } MYSTR; | ||
+ | |||
+ | MYSTR const mine = { 7, 4.4}; | ||
</source> | </source> | ||
[[Category:C]] | [[Category:C]] |
Latest revision as of 12:29, 17 May 2019
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:
- Transfer the address of the pointer in memory to the function ( A pointer to the original structure)
- 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};