Я натолкнулся на некоторый код на C, который компилируется, но я не понимаю, почему. В частности, у меня есть библиотека C, в которой много кода, использующего этот формат:
void get_xu_col(int i_start,
int n,
double x[n],
int n_x,
int n_u,
int n_col,
double xu_col[n_col][n_x + n_u]){
...
}
int main(){
...
double xu_col[n_col][n_x + n_u];
get_xu_col( ..., xu_col );
...
}
Я не понимаю, почему компилятор позволяет определять размеры в массивах. Насколько я понимаю, размеры должны быть фиксированными (например, xu_col[9][7]
) или неопределенными (например, xu_col[][]
). В приведенном выше коде показано, что размеры не являются константами времени компиляции.
Компилятор просто игнорирует аргументы здесь? или действительно ли он выполняет проверку времени измерения по размеру?
Если это последний, то кажется, что он подвержен ошибкам, чтобы передавать размеры отдельно.
Вторая часть вопроса:
Почему в C++ не работает такая же версия? Когда я буквально изменяю расширение файла с .c
на .cpp
и пытаюсь перекомпилировать, я получаю
candidate function not viable: no known conversion from 'double [n_col][n_x + n_u]' to 'double (*)[n_x + n_u]' for 7th argument
void get_xu_col(int i_start, int n, double x[n], int n_x, int n_u, int n_col, double xu_col[n_col][n_x + n_u]);
Я хотел бы знать, какую идиому я должен использовать для преобразования этого кода в C++, поскольку, по-видимому, предыдущая идиома была чем-то, что работает на C, но не C++.