Передача массива [CONST] [] в функцию C? - PullRequest
0 голосов
/ 04 мая 2018

Я проектирую интерфейс функции C, который включает 2d массив. Проблема в том, что размерность строки постоянна, а первый столбец должен быть определен пользователем.

#define ROWS (65)
void init(int columns, float array[ROWS?][columns?])
{
   ...
}

void main()
{
    float array1[ROWS][30]; 
    float array2[ROWS][50]; 
    init(30, array1); 
    init(50, array2); 
} 

Как мне спроектировать интерфейс, чтобы можно было передавать этот вид массива в функцию?

приписка
Не может сделать это наоборот, где столбцы будут постоянными, потому что должны использовать некоторые 3-х парные библиотеки, которые хотят этого.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы упомянули в комментарии. Так что не должно быть слишком сложно приблизиться к тому, что вы хотите. На самом деле, вы почти там сами. Это может выглядеть так:

#define ROWS 65
void init(int columns, float array[static ROWS][columns])
{

}

Теперь array имеет изменяемый тип, а columns определяется пользователем. static ROWS означает, что вызывающие абоненты должны передать в массив не менее 65 строк, иначе будет определено неопределенное поведение. Это очень близко к тому, чтобы заставить их пройти 65, насколько вы можете.

0 голосов
/ 04 мая 2018

Просто сделайте, как вы написали в своем примере

void init (size_t rows, size_t columns, float array[rows][columns])

Затем вы можете передавать константы времени компиляции или переменные времени выполнения в любой момент. Вам также понадобится компилятор C текущего тысячелетия (C99 или новее).

...