cannam@95: cannam@95:
cannam@95:cannam@95: Previous: Dynamic Arrays in C, cannam@95: Up: Multi-dimensional Array Format cannam@95:
A different method for allocating multi-dimensional arrays in C is cannam@95: often suggested that is incompatible with FFTW: using it will cannam@95: cause FFTW to die a painful death. We discuss the technique here, cannam@95: however, because it is so commonly known and used. This method is to cannam@95: create arrays of pointers of arrays of pointers of ...etcetera. cannam@95: For example, the analogue in this method to the example above is: cannam@95: cannam@95:
     int i,j;
cannam@95:      fftw_complex ***a_bad_array;  /* another way to make a 5x12x27 array */
cannam@95:      
cannam@95:      a_bad_array = (fftw_complex ***) malloc(5 * sizeof(fftw_complex **));
cannam@95:      for (i = 0; i < 5; ++i) {
cannam@95:           a_bad_array[i] =
cannam@95:              (fftw_complex **) malloc(12 * sizeof(fftw_complex *));
cannam@95:           for (j = 0; j < 12; ++j)
cannam@95:                a_bad_array[i][j] =
cannam@95:                      (fftw_complex *) malloc(27 * sizeof(fftw_complex));
cannam@95:      }
cannam@95: 
cannam@95:    As you can see, this sort of array is inconvenient to allocate (and
cannam@95: deallocate).  On the other hand, it has the advantage that the
cannam@95: (i,j,k)-th element can be referenced simply by
cannam@95: a_bad_array[i][j][k].
cannam@95: 
cannam@95:    
If you like this technique and want to maximize convenience in accessing
cannam@95: the array, but still want to pass the array to FFTW, you can use a
cannam@95: hybrid method.  Allocate the array as one contiguous block, but also
cannam@95: declare an array of arrays of pointers that point to appropriate places
cannam@95: in the block.  That sort of trick is beyond the scope of this
cannam@95: documentation; for more information on multi-dimensional arrays in C,
cannam@95: see the comp.lang.c
cannam@95: FAQ.
cannam@95: 
cannam@95: 
cannam@95:    
cannam@95: