Пренаписвам куп C99 VLA за проект с отворен код за поддръжка в Visual Studio. Така че имам много твърдения като
void somefunc(double var[r]){...}
на който пренаписвам
void somefunc(double *var) {
var = malloc(sizeof(double) * r);
...
free(var);
}
Което предполагам, че е правилният начин да направите това.
Проблемът е, че започвам да виждам някои по-сложни VLA декларации, които ме оставят в безизходица. Например:
double *(*var)[length1][length2][length3] = malloc(sizeof(double *[length4][length1][length2][length3]));
Така че за мен това по същество изглежда като 5-измерен масив. Това очевидно е незаконно в C89 поради използването на променливи във функцията sizeof()
.
Моето предположение как да пренапиша това би било:
double *****var = malloc(sizeof(double ****) * length1);
for(int i = 0; i<length1; i++) {
var[i] = malloc(sizeof(double ***) * length2);
for(int j = 0; j<length2; j++) {
var[i][j] = malloc(sizeof(double **) * length3);
for(int k = 0; k<length3; k++) {
var[i][j][k] = malloc(sizeof(double *) * length4);
}
}
}
Колкото и объркано да е, това е най-доброто ми предположение как да пренапиша горното твърдение. Това технически правилно ли е и има ли по-добър начин да направя това?
double *(*var)[length1][length2][length3] = malloc(sizeof(double *[length4][length1][length2][length3]));
, трябва да пренапишете цялата програма от самото начало. - person Iharob Al Asimi   schedule 18.01.2016double
указатели. - person user4520   schedule 18.01.2016A[i][j][k]
катоA1d[(i * N + j) * P + k]
. Разбира сеA1d
се разпределя сM*N*P
елемента. Тази караница е причината vla да бъдат добавени към езика! - person Gene   schedule 18.01.2016double var[r]
) почти със сигурност е грешно. - person user253751   schedule 18.01.2016clang
или MinGW версия наgcc
... - person user268396   schedule 18.01.2016