1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include "openmx_common.h"
6 
7 #ifdef DEBUG
8 #undef DEBUG
9 #endif
10 
malloc_multidimarray(char * type,int N,int * size)11 void *malloc_multidimarray(char *type, int N, int *size)
12 {
13    int i;
14    void **ret,*r;
15 
16    if (strcasecmp(type,"double")==0) {
17       if (N==1) {
18          r=  (void*)malloc(sizeof(double)*size[0]);
19 #ifdef DEBUG
20          printf("malloc_multidimarray: %x  (size=%d)\n",r,size[0]);
21 #endif
22          return r;
23       }
24       else {
25           ret=(void**)malloc(sizeof(double*)*size[0]);
26 #ifdef DEBUG
27           printf("malloc_multidimarray: %x\n next size=%d\n",ret,size[0]);
28 #endif
29           for (i=0;i<size[0];i++) {
30               ret[i]=(void*)malloc_multidimarray(type,N-1,&size[1]);
31           }
32           return ret;
33       }
34   }
35   else if (strcasecmp(type,"dcomplex")==0) {
36       if (N==1) {
37           r=(void*)malloc(sizeof(dcomplex)*size[0]);
38 #ifdef DEBUG
39           printf("malloc_multidimarray: %x  (size=%d)\n",r,size[0]);
40 #endif
41           return r;
42       }
43       else {
44           ret=(void**)malloc(sizeof(dcomplex*)*size[0]);
45 #ifdef DEBUG
46           printf("malloc_multidimarray: %x\n next size=%d\n",ret,size[0]);
47 #endif
48           for (i=0;i<size[0];i++) {
49               ret[i]=(void*)malloc_multidimarray(type,N-1,&size[1]);
50           }
51           return ret;
52       }
53   }
54   else if (strcasecmp(type,"float")==0) {
55       if (N==1) {
56 
57           return (void*)malloc(sizeof(float)*size[0]);
58       }
59       else {
60           ret=(void**)malloc(sizeof(float*)*size[0]);
61           for (i=0;i<size[0];i++) {
62               ret[i]=(void*)malloc_multidimarray(type,N-1,&size[1]);
63           }
64           return ret;
65       }
66   }
67   else if (strcasecmp(type,"int")==0) {
68       if (N==1) {
69 
70           return (void*)malloc(sizeof(int)*size[0]);
71       }
72       else {
73           ret=(void**)malloc(sizeof(int*)*size[0]);
74           for (i=0;i<size[0];i++) {
75               ret[i]=(void*)malloc_multidimarray(type,N-1,&size[1]);
76           }
77           return ret;
78       }
79   }
80   else if (strcasecmp(type,"char")==0) {
81       if (N==1) {
82 
83           return (void*)malloc(sizeof(char)*size[0]);
84       }
85       else {
86           ret=(void**)malloc(sizeof(char*)*size[0]);
87           for (i=0;i<size[0];i++) {
88               ret[i]=(void*)malloc_multidimarray(type,N-1,&size[1]);
89           }
90           return ret;
91       }
92   }
93   else {
94       printf("not supported type=%s\n",type);
95       exit(10);
96   }
97 }
98 
99 
free_multidimarray(void ** p,int N,int * size)100 void free_multidimarray(void **p,  int N, int *size)
101 {
102    int i;
103 
104    if (N>1) {
105      for (i=(size[0]-1);i>=0;i--){
106        free_multidimarray(p[i],N-1,&size[1]);
107        p[i]=NULL;
108      }
109    }
110 #if DEBUG
111    printf("free_multidimarray: %x \n",p);
112 #endif
113    free(p);
114 
115 }
116 
117 #if 0
118 main()
119 {
120    int N, size[10];
121    double *v1,***v3;
122    int i,j,k;
123 
124    N=1;
125    size[0]=5;
126 
127    N=3;
128    size[1]=2;
129    size[2]=3;
130    v3=(double***)malloc_multidimarray("double",N,size);
131    for (i=1;i<5;i++) for (j=1;j<2;j++) for(k=1;k<3;k++)  v3[i][j][k]=100*i+10*j+k;
132    for (i=1;i<5;i++) for (j=1;j<2;j++) for(k=1;k<3;k++)  printf("%lf\n",v3[i][j][k]);
133 
134   free_multidimarray(v3,N,size);
135 
136 
137 }
138 #endif
139