// ARYAL6.C // 6-dimensional array functions // Last mod.: 2001-07-13 #include "arraysi.h" #include "arrays.h" /* This returns a pointer <a> which is used as a 6-dimensional array. * The elements of the array can be accessed as a[i][j][k][l][m][n]. * The return value should be typecast using the A6 macro. * If init_val != NULL then the array is initialized using * the <size> bytes at location <init_val>, otherwise it is * initialized with null bytes. */ /*----------------------------------------*/ void ******lib_array6_alloc(unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4, unsigned int n5, unsigned int n6, unsigned int size, // size of element void *init_val, // initialization value int *err_flag) { unsigned int i, j, k, l, m; unsigned int row_size = n6*size; unsigned int num_bytes = n1*n2*n3*n4*n5*row_size; void ******a; char *data_space; *err_flag = ARRAYS_NO_ERROR; // Argument error checking done in ARYAL.C. // First allocate (and possibly initialize) the data space. if ( init_val == NULL ) data_space = mem_alloc_ch(num_bytes,0,err_flag); else /* allocate memory for data space */ { data_space = mem_alloc(num_bytes,err_flag); if ( !*err_flag ) /* if no error */ lib_initialize_array(data_space,n1*n2*n3*n4*n5,size,init_val); } if ( !*err_flag ) { // Set up a 6-dimensional array of pointers to the rows. a = (void ******)lib_array5_alloc(n1,n2,n3,n4,n5,sizeof(void *),NULL,err_flag); if ( *err_flag ) /* if error */ free(data_space); else /* if no error */ { // Set up pointers into the data space. for ( i=0; i<n1; i++ ) { for ( j=0; j<n2; j++ ) { for ( k=0; k<n3; k++ ) { for ( l=0; l<n4; l++ ) { for ( m=0; m<n5; m++ ) { a[i][j][k][l][m] = data_space; data_space += row_size; } } } } } } } if ( *err_flag ) a = NULL; return ( a ); } // Free a 6-dimensional array previously allocated. /*-----------------------------*/ int lib_array6_free(void ******a) { void *data_space; int result = false; if ( a != NULL ) { data_space = a[0][0][0][0][0]; lib_array5_free((void *****)a); if ( data_space != NULL ) { free(data_space); result = true; } } return ( result ); }