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);
}