help converting multi-dim arrays

Stanley Friesen friesen at psivax.UUCP
Wed Apr 10 03:55:53 AEST 1985


In article <569 at utcs.UUCP> physics at utcs.UUCP writes:
>From utfyzx!harrison Thu Apr  4 19:53:50 1985
>Received: by utcs.UUCP (4.24/4.7) id AA12979; Thu, 4 Apr 85 19:53:46 est
>Date: Thu, 4 Apr 85 19:53:46 est
>From: utfyzx!harrison
>Apparently-To: physics
>[]
>The problem: a large piece of code with a number of arrays, some 
>2 dimensional and a few 3 dimensional, accessed with lines like:
>
>    for(row=0; row<numrows; row++)
>        for(col=0; col<numcols; col++)
>            ...data[row][col] ...
>
>The declaration of the matrices, such as
>
>    static double data[MAXROWS][MAXCOLS]; /* just like FORTRAN */
>
>is larger than any conceivable set of data it will be asked to 
>deal with, and wastes scads of memory.  So, we want to convert 
>the code to use malloc(3C) to dynamically allocate memory and 
>save all that wasted space. But, we still want to access the 
>matrices as:
>           ...data[row][col] ...
>Any ideas?
>Dave Harrison, Dept. of Physics, Univ. of Toronto: ..utzoo!utcs!physics

	Fairly simple. given that you can can calculate the number
of rows and columns desired the following should work:

	char *calloc();
	double **vec;
	int rows, cols, i;

	rows = some stuff;
	cols = other stuff;

	/* Allocate a vector of row pointers of size rows	*/
	vec = (double **)calloc(rows, sizeof(double *));

	/* Allocate a vector of doubles for each row	*/
	for(i = 0; i < rows; i++)
	{
		vec[i] = (double *)calloc(cols, sizeof(double));
	}

And make sure all your routines that use it know how many rows
and columns actually exist and never access past the end.
With this proviso "vec" is usable *exactly* like "data" above.

If you do not have calloc() it is equivalent to malloc(num*size)
-- 

				Sarima (Stanley Friesen)

{trwrb|allegra|cbosgd|hplabs|ihnp4|aero!uscvax!akgua}!sdcrdcf!psivax!friesen
or {ttdica|quad1|bellcore|scgvaxd}!psivax!friesen



More information about the Comp.lang.c mailing list