При создании переменных ctypes нельзя ли передавать значения с помощью переменных Python?
У меня есть код, в котором я вызываю общую библиотеку C. Если я передам параметры в эту библиотеку C, используя метод 1 (см. ниже), все будет работать хорошо. Но если я воспользуюсь методом 2, то получу фигню. В коде есть и другие части. Но я подтвердил, что когда я заменяю метод 2 на метод 1, все работает хорошо. Значит, здесь что-то не так.
Если то, что я делаю в методе 2, недопустимо, какова альтернатива, если я хочу автоматизировать процесс запуска кода для разных значений заданной переменной (переменных)?
Метод 1 (это работает хорошо)
import ctypes as C
c_thresholds = (C.c_double * 4)()
for idx, value in enumerate(thresholds):
c_thresholds[idx] = value
goodH = Good(C.c_char('H'), C.c_double(0.5), C.c_int(100), C.c_int(20))
goodL = Good(C.c_char('L'), C.c_double(0.5), C.c_int(75), C.c_int(20))
c_parameters = Params(
var1 = C.c_int(100),
var2 = C.c_int(4),
var3 = C.c_int(5),
var4 = C.c_int(5000),
var5 = C.c_char_p("modelname"),
var6 = C.c_double(0.5),
var7 = C.c_double(90),
var8 = c_thresholds,
var9 = C.c_int(2),
H = goodH,
L = goodL
)
runsimulation(c_parameters)
Метод 2 (этот метод не работает, выводит мусор)
import ctypes as C
def create_cparams(var1, var2, var3, var4, var5, var6, var7, var8, var9):
c_thresholds = (C.c_double * 4)()
for idx, value in enumerate(var8):
c_thresholds[idx] = value
goodH = Good(C.c_char('H'), C.c_double(0.5), C.c_int(100), C.c_int(20))
goodL = Good(C.c_char('L'), C.c_double(0.5), C.c_int(75), C.c_int(20))
c_parameters = Params(
var1 = C.c_int(var1),
var2 = C.c_int(var2),
var3 = C.c_int(var3),
var4 = C.c_int(var4),
var5 = C.c_char_p(var5),
var6 = C.c_double(var6),
var7 = C.c_double(var7),
var8 = c_thresholds,
var9 = C.c_int(var9),
H = goodH,
L = goodL
)
return c_parameters
# These are python variables
var1 = 100
var2 = 4
var3 = 5
var4 = 5000
var5 = "modelname"
var6 = 0.5
var7 = 90
var8 = [1, 0.9, 0.8, 0.7]
var9 = 2
# Calling the create_cparams function defined above
c_parameters = create_cparams(var1, var2, var3, var4, var5, var6, var7, var8, var9)
runsimulation(c_parameters)
В случае, если это полезно, класс Params задается (не меняется в двух методах):
class Params(C.Structure):
_fields_ = [
("var1", C.c_int),
("var2", C.c_int),
("var3", C.c_int),
("var4", C.c_int),
("var5", C.c_char_p ),
("var6", C.c_double),
("var7", C.c_double),
("var8", (C.c_double * 4) ),
("var9", C.c_int),
("H", Good),
("L", Good)
]
Прототип функции C
// runsimulation() function above calls this C function
void run_multiple_reps (struct params parameters, struct repdata *data,
int len_timepdsarr, int *timepdsarr);
// params struct on C side, which Params class duplicates
struct params
{
int var1;
int var2;
int var3;
int var4;
char *var5;
double var6;
double var7;
double var8[4];
int var9;
struct good H;
struct good L;
};
Подробнее здесь: https://stackoverflow.com/questions/186 ... d-coded-va
Как создать переменные ctypes, используя переменные Python вместо жестко закодированных значений? ⇐ Python
Программы на Python
1763391951
Anonymous
При создании переменных ctypes нельзя ли передавать значения с помощью переменных Python?
У меня есть код, в котором я вызываю общую библиотеку C. Если я передам параметры в эту библиотеку C, используя метод 1 (см. ниже), все будет работать хорошо. Но если я воспользуюсь методом 2, то получу фигню. В коде есть и другие части. Но я подтвердил, что когда я заменяю метод 2 на метод 1, все работает хорошо. Значит, здесь что-то не так.
Если то, что я делаю в методе 2, недопустимо, какова альтернатива, если я хочу автоматизировать процесс запуска кода для разных значений заданной переменной (переменных)?
[b]Метод 1 (это работает хорошо)[/b]
import ctypes as C
c_thresholds = (C.c_double * 4)()
for idx, value in enumerate(thresholds):
c_thresholds[idx] = value
goodH = Good(C.c_char('H'), C.c_double(0.5), C.c_int(100), C.c_int(20))
goodL = Good(C.c_char('L'), C.c_double(0.5), C.c_int(75), C.c_int(20))
c_parameters = Params(
var1 = C.c_int(100),
var2 = C.c_int(4),
var3 = C.c_int(5),
var4 = C.c_int(5000),
var5 = C.c_char_p("modelname"),
var6 = C.c_double(0.5),
var7 = C.c_double(90),
var8 = c_thresholds,
var9 = C.c_int(2),
H = goodH,
L = goodL
)
runsimulation(c_parameters)
[b]Метод 2 (этот метод не работает, выводит мусор)[/b]
import ctypes as C
def create_cparams(var1, var2, var3, var4, var5, var6, var7, var8, var9):
c_thresholds = (C.c_double * 4)()
for idx, value in enumerate(var8):
c_thresholds[idx] = value
goodH = Good(C.c_char('H'), C.c_double(0.5), C.c_int(100), C.c_int(20))
goodL = Good(C.c_char('L'), C.c_double(0.5), C.c_int(75), C.c_int(20))
c_parameters = Params(
var1 = C.c_int(var1),
var2 = C.c_int(var2),
var3 = C.c_int(var3),
var4 = C.c_int(var4),
var5 = C.c_char_p(var5),
var6 = C.c_double(var6),
var7 = C.c_double(var7),
var8 = c_thresholds,
var9 = C.c_int(var9),
H = goodH,
L = goodL
)
return c_parameters
# These are python variables
var1 = 100
var2 = 4
var3 = 5
var4 = 5000
var5 = "modelname"
var6 = 0.5
var7 = 90
var8 = [1, 0.9, 0.8, 0.7]
var9 = 2
# Calling the create_cparams function defined above
c_parameters = create_cparams(var1, var2, var3, var4, var5, var6, var7, var8, var9)
runsimulation(c_parameters)
В случае, если это полезно, класс Params задается (не меняется в двух методах):
class Params(C.Structure):
_fields_ = [
("var1", C.c_int),
("var2", C.c_int),
("var3", C.c_int),
("var4", C.c_int),
("var5", C.c_char_p ),
("var6", C.c_double),
("var7", C.c_double),
("var8", (C.c_double * 4) ),
("var9", C.c_int),
("H", Good),
("L", Good)
]
[b]Прототип функции C[/b]
// runsimulation() function above calls this C function
void run_multiple_reps (struct params parameters, struct repdata *data,
int len_timepdsarr, int *timepdsarr);
// params struct on C side, which Params class duplicates
struct params
{
int var1;
int var2;
int var3;
int var4;
char *var5;
double var6;
double var7;
double var8[4];
int var9;
struct good H;
struct good L;
};
Подробнее здесь: [url]https://stackoverflow.com/questions/18691035/how-to-creating-ctypes-variables-using-python-variables-instead-of-hard-coded-va[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия