Я переписываю кучу 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