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