Двойной массив ctypes кодирует неправильно (1.35689368162e-312 -> 0.047098) - PullRequest
1 голос
/ 26 сентября 2011

У меня есть функция, которая принимает двойной массив в качестве первого параметра.

cb_type = CFUNCTYPE(c_void_p, c_double * 2, c_int, c_int)
def mycb(cube, ndim, nparams):
    print "cube before", [v for v in cube]
    for i in range(ndim):
        cube[i] = cube[i] * 10 * math.pi
    print "cube after", [v for v in cube]

Я передаю его C через обычный cb_type (mycb).

C вызывает его:

printf("values before: %f, %f\n", Cube[0], Cube[1]);
cb(Cube, *ndim, *npars);
printf("values after : %f, %f\n", Cube[0], Cube[1]);

Когда я запускаю программу, возникает проблема с упаковкой / распаковкой или декодированием:

values before: 0.047098, 0.010474           | C
cube before [4.3191267336e-314, 1e-323]     | Python, should be the same values
cube after [1.35689368162e-312, 3.1e-322]   | Python
values after : 0.047098, 0.010474           | C

Как я могу исправить проблему с кодировкой (получите [0.047098, 0.010474] в функции python)

1 Ответ

0 голосов
/ 29 сентября 2011

Я исправил это, используя POINTER (c_double) вместо c_double * 2 .

Новый вывод выглядит так:

values before: 0.905349, 0.270400
cube before [0.905348643442958, 0.2703996141057701]
cube after [28.44236647177882, 8.494854412082024]
values after : 28.442366, 8.494854
...