Форум сайта python.su
Доброго времени суток всем и с праздником.
Проблема при вызове функции из dll библиотеки, видимо что-то не так с типами передаваемых аргументов.
from ctypes import *
from array import array
swedll = windll.swedll32
#************************************************************
# вызов функции swedll.swe_julday() проходит нормально
#************************************************************
sName = ""
sName = swedll.swe_get_planet_name(1, sName)
jul_day_UT = 0
jul_day_UT = swedll.swe_julday(2011, 4, 23, c_double(0.10), 1)
print "jul_day_UT: ", jul_day_UT
#************************************************************
# вызов функции swe_calc_ut() не работает
#************************************************************
arr_lst = [30.0, 40.0, 0.0, 0.0, 0.0, 0.0 ]
arr_type = c_double * len(arr_lst)
arr = arr_type(*arr_lst)
sErr = create_string_buffer(256)
ret_flag = swedll.swe_calc_ut(c_int(jul_day_UT), c_int(1), c_int(0), byref(arr), byref(sErr))
print "ret_flag: ", ret_flag
for i in arr: print i
swedll.swe_close()
Офлайн
сравните
ret_flag = swedll.swe_calc_ut(c_int(jul_day_UT), c_int(1), c_int(0), byref(arr), byref(sErr))
и
int swe_calc_ut ( double tjd_ut, int ipl, int iflag, double* xx, char* serr);
Офлайн
Андрей СветловСпасибо, исправил, эта ошибка исчезла.
Офлайн
Но код все еще не заработал.
from ctypes import *
from array import array
swedll = windll.swedll32
************************************************************
# вызов функции swedll.swe_julday() проходит нормально
#************************************************************
sName = ""
sName = swedll.swe_get_planet_name(1, sName)
jul_day_UT = 0
jul_day_UT = swedll.swe_julday(2011, 4, 23, c_double(0.10), 1)
print "jul_day_UT: ", jul_day_UT
#************************************************************
# вызов функции swe_calc_ut() не работает
#************************************************************
arr_lst = [30.0, 40.0, 0.0, 0.0, 0.0, 0.0 ]
arr_type = c_double * len(arr_lst)
arr = arr_type(*arr_lst)
sErr = create_string_buffer(256)
ret_flag = swedll.swe_calc_ut(c_double(jul_day_UT), c_int(1), c_int(0), byref(arr), byref(sErr))
print "ret_flag: ", ret_flag
for i in arr: print i
#********************************************************************
swedll.swe_close()
Отредактировано (Май 9, 2011 21:46:29)
Офлайн
А вы уверены, что swedll32 именно windll? Без дополнительных указаний VC генерирует код с соглашениями вызова cdecl а не stdcall.
Для ctypes это будет cdll.
Офлайн
Андрей СветловУверенности не было, просто с cdll - вообще сыпались одни ошибки, и были сообщения, что функции в dll не находятся, поэтому от этого варианта пришлось отказаться.
А вы уверены, что swedll32 именно windll?
Для ctypes это будет cdll.
# -*- coding: cp1251 -*-
Офлайн
Кодировка причиной ошибки быть не может. Это — наверняка.
Офлайн