Форум сайта python.su
Хотел бы по вызову из пункта меню File вызвать из MyDll функцию GetArray(char* str, float a), которая принимает название файла, читает данные из файла и помещает их в массив. В конечном итоге эти данные нужно поместить в таблицу, но для начала хотя бы для проверки правильности работы с DLL просто напечатать в поле ввода. На http://slil.ru/27437052 находятся заготовка задачи, dll, код dll на С и данные. DLL проверял, из проекта на LabView функция успешно вызывалась. Помогите, пожалуйста.
Офлайн
Для начала:
1. Вы забываете о необходимости указания кодировки файла :(
2. практика работы с wxFrame показывает, что для главного окна целесообразно вызывать Destroy руками, т.е
# в конструкторе делаем привязку к событию
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
# ну и сама функция
def OnCloseWindow (self, event) :
# сначала убираем свой собственный мусор,
# если таковой имеется, а затем...
self.Destroy()
from ctypes import *
GetArray = cdll.mydll.GetArray
def get_array () :
# память под массив должна выделять вызывающая программа
# Ваша библиотека не предоставляет средств для определения размера данных,
# перепешите функцию, скажем следующим образом:
# если передается нулевой указатель на массив - значит нужно вернуть общий размер
# данных, в противном случае - размер реально прочитанных данных
# это у Вас пока не предусмотрено :)
# size = GetArray("Данные.txt", None)
# имеем 12 строк (пришлось залезть в файл и посчитать) по три столбца,
# значит размер массива:
size = 24 # 12 * 2 в( Вашем файле их всего 2 :()
# выделяем память под массив
dataBuffer = (size * c_float)()
# вызываем Вашу функцию
GetArray("Данные.txt", byref(dataBuffer))
# каким-то образом проверяем все ли считано и, ели нет ошибок продолжаем
rowCount = size / 2 # число столбцов известно заранее (в Вашем файле их 2 :()
for i in xrange(rowCount) :
print(u"строка %02d:" % i, end=" ")
for j in xrange(2) :
print(dataBuffer[i*2+j], end=" | ")
print(end="\n")
Офлайн
pyuser
Твердая пятерка. Особенно за комментарии по выделению/освобождению памяти.
Офлайн
Огромное спасибо за подробные объяснения и разбор моего примера! На питоне мне нужно создавать фронтэнды для своих программ, они достаточно сложные и написаны как консольные приложения на С (без С++). Мне нужно будет их перевести в DLL (прикрепленная - только для примера, не реальная) и я очень боялся, что на питоне вызов функций из DLL может не получиться. Теперь я понял, что все должно получиться, нужно садиться изучать питон и его механизмы вызова функций из DLL, тогда все мои консольные приложения будут “хорошо выглядеть”.
Офлайн
Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?
Офлайн
Андрей СветловСпасибо.
pyuser
Твердая пятерка.
Офлайн
tumanovalexпервой строкой в скрипте желательно указывать кодировку, об этом везде пишут, сам Python говорит об этом при запуске скриптов (если где либо в скрипте используется язык отличный от английского)
Забыл спросить. По первому пункту ответа: 1. Вы забываете о необходимости указания кодировки файла. Имеется в виду питоновский файл? Что нужно указать?
# -*- mode: python; coding: cp1251 -*-
Офлайн