Двумерные массивы планировал создавать следующим образом:
a = 56
b = 4
array = [[0 for i in range(a)] for k in range(b)]
Сейчас я решил свою проблему, сколхозив передачу нескольких одномерных массивов в C-функцию. Пока это сгодится, но мне желательно бы иметь возможность изменять произвольное количество массивов, а не 8, как в коде ниже.
Код на Python функции, которая собирает C-функцию с помощью ctypes:
def read_csi(csi_buf, nr, nc, num_tones):
'''Расшифровывает csi из csi_buf, вызывая с помощью ctypes C-функцию'''
if nr != 2 or nc != 2 or num_tones != 56:
raise TypeError("Error: nr != 2 or nc != 2 or num_tones != 56")
csi_re = [[0 for i in range(num_tones)] for k in range(nr * nc)]
csi_im = [[0 for i in range(num_tones)] for k in range(nr * nc)]
lib = ctypes.CDLL('./libextract_csi.so')
lib.read_csi.restype = None
lib.read_csi.argtypes = (ctypes.POINTER(ctypes.c_ubyte), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(
ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
csi_buf = (ctypes.c_ubyte * len(csi_buf))(*csi_buf)
for i in range(nr*nc):
csi_re[i] = (ctypes.c_int * len(csi_re[i]))(*csi_re[i])
csi_im[i] = (ctypes.c_int * len(csi_im[i]))(*csi_im[i])
lib.read_csi(csi_buf, csi_re[0], csi_re[1],
csi_re[2], csi_re[3], csi_im[0], csi_im[1], csi_im[2], csi_im[3])
csi_re[0], csi_re[1], csi_re[2], csi_re[3] = csi_re[0][:], csi_re[1][:], csi_re[2][:], csi_re[3][:]
csi_im[0], csi_im[1], csi_im[2], csi_im[3] = csi_im[0][:], csi_im[1][:], csi_im[2][:], csi_im[3][:]
return {'re': csi_re, 'im': csi_im}
Код C-функции:
void read_csi(unsigned char *local_h, int *re0, int *re1, int *re2, int *re3, int *im0, int *im1, int *im2, int *im3)
{
//здесь происходит изменение содержимого всех массивов re и im на основании данных из local_h
}