cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: FFTW 3.3.5: Dynamic Arrays in C-The Wrong Way cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: cannam@127:
cannam@127:

cannam@127: Previous: , Up: Multi-dimensional Array Format   [Contents][Index]

cannam@127:
cannam@127:
cannam@127: cannam@127:

3.2.5 Dynamic Arrays in C—The Wrong Way

cannam@127: cannam@127:

A different method for allocating multi-dimensional arrays in C is cannam@127: often suggested that is incompatible with FFTW: using it will cannam@127: cause FFTW to die a painful death. We discuss the technique here, cannam@127: however, because it is so commonly known and used. This method is to cannam@127: create arrays of pointers of arrays of pointers of …etcetera. cannam@127: For example, the analogue in this method to the example above is: cannam@127:

cannam@127:
cannam@127:
int i,j;
cannam@127: fftw_complex ***a_bad_array;  /* another way to make a 5x12x27 array */
cannam@127: 
cannam@127: a_bad_array = (fftw_complex ***) malloc(5 * sizeof(fftw_complex **));
cannam@127: for (i = 0; i < 5; ++i) {
cannam@127:      a_bad_array[i] = 
cannam@127:         (fftw_complex **) malloc(12 * sizeof(fftw_complex *));
cannam@127:      for (j = 0; j < 12; ++j)
cannam@127:           a_bad_array[i][j] =
cannam@127:                 (fftw_complex *) malloc(27 * sizeof(fftw_complex));
cannam@127: }
cannam@127: 
cannam@127: cannam@127:

As you can see, this sort of array is inconvenient to allocate (and cannam@127: deallocate). On the other hand, it has the advantage that the cannam@127: (i,j,k)-th element can be referenced simply by cannam@127: a_bad_array[i][j][k]. cannam@127:

cannam@127:

If you like this technique and want to maximize convenience in accessing cannam@127: the array, but still want to pass the array to FFTW, you can use a cannam@127: hybrid method. Allocate the array as one contiguous block, but also cannam@127: declare an array of arrays of pointers that point to appropriate places cannam@127: in the block. That sort of trick is beyond the scope of this cannam@127: documentation; for more information on multi-dimensional arrays in C, cannam@127: see the comp.lang.c cannam@127: FAQ. cannam@127:

cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: