Как мне написать функцию C, чтобы принимать список в качестве аргументов?
Короткий ответ, Вы не можете .
Длинный ответ: C не имеет списков, но имеет массивы и указатели.
У вас есть несколько вариантов:
int c_func(const char *dir, float abcd[4]) { // using an array with explicit size
int c_func(const char *dir, float abcd[]) { // Using an array (will decay to a pointer at compile-time)
int c_func(const char *dir, float *abcd) { // Using a pointer.
Если вы когда-либо будете получать только 4 числа с плавающей запятой, я бы предложил первую форму, которая устанавливает размер массива, и любой пользователь (и в основном ваше будущее Я) вашей функции будет знать, что он предоставит только массив из четырех элементов. .
Вызов вашей функции из Python:
floats = [1.0, 2.0, 3.0, 4.0] # Or whatever values you want to pass, but be sure to give only 4
FloatArray4 = ctypes.c_float * 4 # Define a 4-length array of floats
parameter_array = FloatArray4(*floats) # Define the actual array to pass to your C function
Я не знаю, если передача более 4-х чисел к FloatArray4
вызывает ошибку - я думаю, но сейчас я не могу проверить.
Что касается вашего второго вопроса, если вам нужны массивы динамического размера (более 4 элементов), вам понадобится один из двух других профилей для вашей функции C, и в этом случае я советую вам добавить дополнительный int
аргумент для размера массива:
int c_func(const char *dir, float floats[], int size) {
или
int c_func(const char *dir, float *floats, int size) {
Вы также можете использовать стандартный size_t
вместо int
, он предназначен именно для этого.
Если вы хотите передать многомерный массив, вы добавляете еще одну пару скобок:
int c_func(const char *dir, float floats[][4]) { // Note the explicit size for second dimension
но помните, что для массива C для всех измерений, кроме первого, размеры должны быть явно указаны . Если значение является постоянным, это не будет проблемой, однако, если нет, вам придется использовать вместо этого указатель:
int c_func(const char *dir, float *floats[]) {
или
int c_func(const char *dir, float **floats) {
, которые представляют собой два идентичных синтаксиса (массив будет распадаться на указатель). Еще раз, если ваши размеры являются динамическими, я предлагаю добавить параметры для размера.
Если вам нужны дополнительные размеры, просто повторите этот последний шаг.