C-help

C is one of the fastest languages to write codes on. Although it may be a bit less user-friendly, it provides excellent flexibility when writing heavy numerical code. 

Multidimensional Arrays

Multi-dimensional arrays are very useful when saving different quantities under a single variable. The current example uses a dynamic array (pointers) structure for defining multi-D arrays.  

#include<stdio.h>

#include<stdlib.h>

#include<math.h>


double    *Array1D (int, int);

double   **Array2D (int, int, int);

double  ***Array3D (int, int, int, int);

double ****Array4D (int, int, int, int, int);

void FreeArray1D (double *);

void FreeArray2D (int, double **);

void FreeArray3D (int, int, double ***);

void FreeArray4D (int, int, int, double ****);


main()

{

 int i, j, k, l;

 int nx = 5, ny = 6, nz = 3, px = 2;

 double ****pn;


 pn = Array4D (px, nz, ny, nx, sizeof(double));

 printf("memory allocated.\n");


 for(l=0; l<px; l++)

 for(k=0; k<nz; k++)

 for(j=0; j<ny; j++)

 for(i=0; i<nx; i++)

     pn[l][k][j][i] = 1.0 + (i + j*nx + k*nx*ny + l*nx*ny*nz)*1.0;


 for(l=0; l<px; l++){

 for(k=0; k<nz; k++){

 for(j=0; j<ny; j++){

 for(i=0; i<nx; i++) 

     printf("%3.1f\t",pn[l][k][j][i]);

 printf("\n"); }

 printf("\n\n"); }

 printf("\n\n\n"); }


 FreeArray4D(px, nz, ny, pn);


} /* End of main loop */



/* ************************************************************************ 

 * Definitions of different arrays 

 * ************************************************************************ */


double *Array1D (int nx, int dsize)

/* 1D array definition */ 


{

 int i;

 double *v;

 

 v = calloc(nx, dsize);

 

 return v;

}


/* ****************************************************** */

double **Array2D (int ny, int nx, int dsize)

/* 2D array definition */

{

 int i, j;

 double **v;

 v = calloc(ny, sizeof(double *));


 for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);


 return v;

}


/* ******************************************************** */

double ***Array3D (int nz, int ny, int nx, int dsize)

/* 3D array definition */

{

 int k;

 double ***v;

 v = calloc(nz, sizeof(double **));


 for (k=0; k<nz; k++)

      v[k] = Array2D(ny, nx, dsize);


 return v;

}



/* ********************************************************* */

double ****Array4D (int px, int nz, int ny, int nx, int dsize)

/* 4D array definition */

{

 int l;

 double ****v;

 v = calloc(px, sizeof(double ***));


 for (l=0; l<px; l++)

      v[l] = Array3D(nz, ny, nx, dsize);


 return v;

}


/* ********************************************************** *

 * Functions to free higher dimensional arrays 

 * ********************************************************** */

void FreeArray1D (double *v)

{

 free(v);

}


/* ********************************************************* */

void FreeArray2D (int ny, double **v)

{

 int i;

 for (i=0; i<ny; i++) free(v[i]);

 free(v);  

}


/* ******************************************************* */

void FreeArray3D (int nz, int ny, double ***v)

{

 int i;

 for(i=0; i<nz; i++) FreeArray2D (ny, v[i]);

 free(v);

}


/* ********************************************************* */

void FreeArray4D (int px, int nz, int ny, double ****v)

{

 int i;

 for (i=0; i<px; i++) FreeArray3D (nz, ny, v[i]);

 free(v);

}

Structures in C

Much like Python, C can also use structures, i.e. one can choose to define a group of variables/arrays and call them/pass them just using a group head name. Any particular member of a group can be accessed from the group head. 

#include<stdio.h>

#include<stdlib.h>

#include<math.h>


struct Arrays{  /* structure of different vaiables */

 double ****ptr;

 double tn;

}arrays;


double    *Array1D (int, int);

double   **Array2D (int, int, int);

double  ***Array3D (int, int, int, int);

double ****Array4D (int, int, int, int, int);

void FreeArray1D (double *);

void FreeArray2D (int, double **);

void FreeArray3D (int, int, double ***);

void FreeArray4D (int, int, int, double ****);


main()

{ /* main code starts here */

 int i, j, k, l;

 int nx = 5, ny = 6, nz = 3, px = 2;

// double ****ptr;


 arrays.ptr = Array4D (px, nz, ny, nx, sizeof(double)); // allocating 4D memory to the pointer

 printf("memory allocated.\n");


 for(l=0; l<px; l++)       /* assigning values to the array */

 for(k=0; k<nz; k++)

 for(j=0; j<ny; j++)

 for(i=0; i<nx; i++)

     arrays.ptr[l][k][j][i] = 1.0 + (i + j*nx + k*nx*ny + l*nx*ny*nz)*1.0;



 for(l=0; l<px; l++){   /* printing the values stores in the pointer- for checking purpose */

 for(k=0; k<nz; k++){

 for(j=0; j<ny; j++){

 for(i=0; i<nx; i++) 

     printf("%3.1f\t",arrays.ptr[l][k][j][i]);

 printf("\n"); }

 printf("\n\n"); }

 printf("\n\n\n"); }



 FreeArray4D(px, nz, ny, arrays.ptr);     /* free-ing the stored memory */


} /* End of main loop */



/* ************************************************************************ 

 * Definitions of different arrays 

 * ************************************************************************ */


double *Array1D (int nx, int dsize)

/* 1D array definition */ 


{

 int i;

 double *v;

 

 v = calloc(nx, dsize);

 

 return v;

}



/* ****************************************************** */

double **Array2D (int ny, int nx, int dsize)

/* 2D array definition */


{

 int i, j;

 double **v;

 v = calloc(ny, sizeof(double *));


 for (j=0; j<ny; j++) v[j] = Array1D(nx, dsize);


 return v;

}


/* ******************************************************** */

double ***Array3D (int nz, int ny, int nx, int dsize)

/* 3D array definition */

{

 int k;

 double ***v;

 v = calloc(nz, sizeof(double **));


 for (k=0; k<nz; k++)

      v[k] = Array2D(ny, nx, dsize);


 return v;

}



/* ********************************************************* */

double ****Array4D (int px, int nz, int ny, int nx, int dsize)

/* 4D array definition */

{

 int l;

 double ****v;

 v = calloc(px, sizeof(double ***));


 for (l=0; l<px; l++)

      v[l] = Array3D(nz, ny, nx, dsize);


 return v;

}




/* ********************************************************** *

 * Functions to free higher dimensional arrays 

 * ********************************************************** */

void FreeArray1D (double *v)

{

 free(v);

}


/* ********************************************************* */

void FreeArray2D (int ny, double **v)

{

 int i;

 for (i=0; i<ny; i++) free(v[i]);

 free(v);  

}


/* ******************************************************* */

void FreeArray3D (int nz, int ny, double ***v)

{

 int i;

 for(i=0; i<nz; i++) FreeArray2D (ny, v[i]);

 free(v);

}



/* ********************************************************* */

void FreeArray4D (int px, int nz, int ny, double ****v)

{

 int i;

 for (i=0; i<px; i++) FreeArray3D (nz, ny, v[i]);

 free(v);

}