C language: nested dynamic list (nested struct, union)

Subject: to demonstrate the usage of nested dynamic list (nested struct, union) in C-language (C99).

Usage: compile source C-code (for example, with M$ Visual Studio or with GCC)

and run it with one option: the name of file (like <the name of program> <the name of file>).

//------- the start of the C code -------

/********************************************************************* * Author: Stepan A. Baranov (rosmir@gmail.com) * web-site: www.rosmir.org *********************************************************************/ #include <stdio.h> #include <stdlib.h> #if defined(_MSC_VER) // M$ Visual Studio #pragma warning (disable: 4996) #endif #define bl_t 1 /* boolean type */ #define in_t 2 /* integer type */ #define fl_t 3 /* float type */ #define ivl1 vl1.in #define ivl2 vl2.in #define ivl3 vl3.in #define fvl1 vl1.fl #define fvl2 vl2.fl #define fvl3 vl3.fl union typeValue { int in; float fl; }; struct fldSpc { unsigned int Id; unsigned int type; union typeValue vl1; union typeValue vl2; union typeValue vl3; }; struct fldArray { unsigned int num; struct fldSpc *fld; }; struct mbrArray { unsigned int num; struct fldArray *member; }; int main (int argc, const char *argv[]) { FILE *fp; struct mbrArray *list; list = (struct mbrArray *) malloc (sizeof (struct mbrArray)); if (list == NULL) return EXIT_FAILURE; list->member = (struct fldArray *) malloc (2 * sizeof (struct fldArray)); if (list->member == NULL) return EXIT_FAILURE; else list->num = 2; list->member[0].fld = (struct fldSpc *) malloc (2 * sizeof (struct fldSpc)); if (list->member[0].fld == NULL) return EXIT_FAILURE; else list->member[0].num = 2; list->member[1].fld = (struct fldSpc *) malloc (2 * sizeof (struct fldSpc)); if (list->member[1].fld == NULL) return EXIT_FAILURE; else list->member[1].num = 2; list->member[0].fld[1].Id = 12; list->member[0].fld[1].type = in_t; list->member[0].fld[1].ivl1 = 56; list->member[0].fld[1].ivl2 = 123; list->member[0].fld[1].ivl3 = 3; list->member[1].fld[0].Id = 25; list->member[1].fld[0].type = fl_t; list->member[1].fld[0].fvl1 = 9.067f; list->member[1].fld[0].fvl2 = 11.8765f; list->member[1].fld[0].fvl3 = 0.342f; if (argc != 2) return EXIT_FAILURE; fp = fopen (argv[1], "w+b"); if (fp == NULL) return EXIT_FAILURE; fseek (fp, 0, SEEK_SET); fwrite (&list->member[0].fld[1], sizeof (struct fldSpc), 1, fp); fwrite (&list->member[1].fld[0], sizeof (struct fldSpc), 1, fp); fseek (fp, 0, SEEK_SET); fread (&list->member[0].fld[0], sizeof (struct fldSpc), 1, fp); fread (&list->member[1].fld[1], sizeof (struct fldSpc), 1, fp); printf ("%d %d %d %d %d \n", list->member[0].fld[0].Id, list->member[0].fld[0].type, list->member[0].fld[0].ivl1, list->member[0].fld[0].ivl2, list->member[0].fld[0].ivl3); printf ("%d %d %f %f %f \n", list->member[1].fld[1].Id, list->member[1].fld[1].type, list->member[1].fld[1].fvl1, list->member[1].fld[1].fvl2, list->member[1].fld[1].fvl3); free (list->member[0].fld); free (list->member[1].fld); free (list->member); free (list); fclose (fp); return EXIT_SUCCESS; }

//------- the end of the C code -------

©2009 Rosmir - Stepan A. Baranov

$Id: nesteddynamiclist.html 413 2009-01-06 21:16:05Z rosmir $