2010-03-13 6 views

Antwort

1
array = malloc(num_elem * num_elem * num_elem * sizeof(array_elem)); 

Warum nicht? :)

+0

Meine schlechte, schlechte Erklärung. Natürlich gibt es num_elem_x, num_elem_y und num_elem_z. –

+0

+1 einfacher ist besser – AareP

+0

@AareP, es ist einfacher, den Speicher zuzuordnen, aber nicht einfacher zu bedienen. Sie können damit nicht die normale Syntax [i] [j] [k] verwenden. –

4

Dies würde

int main() 
{ 

    int ***p,i,j; 

    p=(int ***) malloc(MAXX * sizeof(int **)); 

    for(i=0;i<MAXX;i++) 
    { 
     p[i]=(int **)malloc(MAXY * sizeof(int *)); 
     for(j=0;j<MAXY;j++) 
      p[i][j]=(int *)malloc(MAXZ * sizeof(int)); 
    } 

    for(k=0;k<MAXZ;k++) 
     for(i=0;i<MAXX;i++) 
      for(j=0;j<MAXY;j++) 
       p[i][j][k]=<something>; 
} 
+0

1) Gießen Sie nicht 'void *' wie von 'malloc' & Freunde in C zurückgegeben. 2)' double *** 'usw. ist nicht ein 3D-Array und es kann nicht als eins verwendet werden! Es verwendet nur die gleiche Syntax wie für die Verwendung von 3D-Arrays beim Indizieren eines Eintrags, hat aber eine sehr unterschiedliche Semantik, wie die komplizierte verschachtelte Zuordnung bereits zeigt. – Olaf

13

arbeitet Es gibt zwei verschiedene Möglichkeiten, um einen 3D-Array zuzuordnen. Sie können es entweder als ein 1D-Array von Zeigern einem (1D-Array von Zeigern zu einem 1D-Array) zuordnen. Dies kann folgendermaßen geschehen:

int dim1, dim2, dim3; 
int i,j,k; 
double *** array = (double ***)malloc(dim1*sizeof(double**)); 

     for (i = 0; i< dim1; i++) { 

     array[i] = (double **) malloc(dim2*sizeof(double *)); 

      for (j = 0; j < dim2; j++) { 

       array[i][j] = (double *)malloc(dim3*sizeof(double)); 
      } 

     } 

Manchmal ist es sinnvoller, das Array als zusammenhängendes Chunk zuzuordnen. Sie werden feststellen, dass viele vorhandene Bibliotheken möglicherweise erfordern, dass das Array im zugewiesenen Speicher vorhanden ist. Der Nachteil davon ist, dass, wenn Ihr Array sehr groß ist, Sie möglicherweise nicht einen so großen zusammenhängenden Chunk im Speicher haben.

const int dim1, dim2, dim3; /* Global variables, dimension*/ 

#define ARR(i,j,k) (array[dim2*dim3*i + dim3*j + k]) 
double * array = (double *)malloc(dim1*dim2*dim3*sizeof(double)); 

Um Ihre Array zugreifen Sie nur das Makro verwenden:

ARR(1,0,3) = 4; 
+0

1) Wirf nicht 'void *', wie es von 'malloc' & friends in C zurückgegeben wird. 2)' double *** 'usw. ist kein 3D-Array und kann nicht als ein solches verwendet werden!Es verwendet nur die gleiche Syntax wie für die Verwendung von 3D-Arrays beim Indizieren eines Eintrags, hat aber eine sehr unterschiedliche Semantik, wie die komplizierte verschachtelte Zuordnung bereits zeigt. – Olaf

0

Für einen bestimmten Typ T (nicht zusammenhängende):

size_t dim0, dim1, dim2; 
... 
T ***arr = malloc(sizeof *arr * dim0); //type of *arr is T ** 
if (arr) 
{ 
    size_t i; 
    for (i = 0; i < dim0; i++) 
    { 
    arr[i] = malloc(sizeof *arr[i] * dim1); // type of *arr[i] is T * 
    if (arr[i]) 
    { 
     size_t j; 
     for (j = 0; j < dim1; j++) 
     { 
     arr[i][j] = malloc(sizeof *arr[i][j] * dim2); 
     } 
    } 
    } 
} 

Es sei denn, Sie arbeiten mit einem sehr alten (Pre-C89) Implementierung, müssen Sie nicht das Ergebnis malloc() zu werfen, und die Praxis wird abgeraten. Wenn Sie vergessen, stdlib.h einzuschließen oder keinen Prototyp für malloc() im Geltungsbereich haben, gibt der Compiler es ein, um int zurückzugeben, und Sie werden eine Warnung vom Typ "inkompatible Typ für Zuweisung" erhalten. Wenn Sie das Ergebnis umsetzen, wird die Warnung unterdrückt, und es gibt keine Garantie dafür, dass eine Konvertierung von einem Zeiger auf einen int Zeiger wieder sinnvoll ist.

+0

'double ***' usw. ist kein 3D-Array und kann nicht als ein solches verwendet werden! Es verwendet nur die gleiche Syntax wie für die Verwendung von 3D-Arrays beim Indizieren eines Eintrags, hat aber eine sehr unterschiedliche Semantik, wie die komplizierte verschachtelte Zuordnung bereits zeigt. – Olaf

0

@Poita_, ok, vielleicht haben Sie recht, aber wenn jemand noch 3-dimensionales Array will in einem großen Teil zugeordnet verwenden, ist hier, wie Sie fügen normale Indizierung es:

void*** newarray(int icount, int jcount, int kcount, int type_size) 
{ 
    void*** iret = (void***)malloc(icount*sizeof(void***)+icount*jcount*sizeof(void**)+icount*jcount*kcount*type_size); 
    void** jret = (void**)(iret+icount); 
    char* kret = (char*)(jret+icount*jcount); 
    for(int i=0;i<icount;i++) 
     iret[i] = &jret[i*jcount]; 
    for(int i=0;i<icount;i++) 
     for(int j=0;j<jcount;i++) 
      jret[i*jcount+j] = &kret[i*jcount*kcount*type_size+j*kcount*type_size]; 
    return iret; 
} 
+0

1) Wirf nicht 'void *', wie es von 'malloc' & friends in C zurückgegeben wird. 2)' double *** 'usw. ist kein 3D-Array und kann nicht als ein solches verwendet werden! Es verwendet nur die gleiche Syntax wie für die Verwendung von 3D-Arrays beim Indizieren eines Eintrags, hat aber eine sehr unterschiedliche Semantik, wie die komplizierte verschachtelte Zuordnung bereits zeigt. – Olaf