crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Передача массива из Qt программы в Free Pascal библиотеку, Вылетает SIGFPE
rominf
  опции профиля:
сообщение 21.8.2012, 23:10
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 20.8.2011
Пользователь №: 2820

Спасибо сказали: 1 раз(а)




Репутация:   0  


Здравствуйте!

К программе на Qt 4 подключается .so библиотека, написанная на Free Pascal (Lazarus). В библиотеке есть функция, принимающая по указателю массив (Size = 10):
type
  TDoubleArray = array  [0..Size - 1] of Double;
  PDoubleArray = ^TDoubleArray;    

procedure Sort(A: PDoubleArray); stdcall;


В программе:
std::vector<double> v(Size, 0);
// Заполнение вектора
typedef double (*Sort)(double [Size]);
Sort sort = (Sort)lib->resolve("Sort");
if (sort)
{
    sort(&v[0]);
    QString s = QString::number(-1.1); // Аналогично если на этом месте стоит что-нибудь с динамическим созданием объекта ("new") (*)
    ...
}

На (*) вылетает с ошибкой SIGFPE.
Если заменить на передачу по ссылке (procedure Sort(var A: TDoubleArray); stdcall;) то всё идентично.
Когда делал аналогично для сумы, но с передачей по значению (function Sum(A: TDoubleArray): Double; stdcall;), то ошибки не возникало.
Замечу, что судя по тому, что показывает дебагер, обе функции работают (при возврате управления в программу вижу отсортированный массив).
Чувствую, что проблема в выделении памяти, но, к сожалению, раньше не имел опыта по созданию динамических библиотек, поэтому не понимаю, что у меня неправильно. И мне не очень нравится использование вектора, чтобы передать его как массив, но писать в стиле С не удобно.
Подскажите, пожалуйста, в чём проблема. Буду благодарен за ссылки на литературу для глубокого изучения вопроса выделения памяти, стека вызовов, динамических библиотек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
PAFOS
  опции профиля:
сообщение 23.8.2012, 9:02
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Посмотри, что значит SIGFPE вики.

И раз уж ты можешь шагнуть в sort, так в чем проблема?
Посмотри где падает и какие значения переменных при падении, ну впрочем че учить, если умеешь пользоваться отладчиком))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rominf
  опции профиля:
сообщение 23.8.2012, 11:42
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 20.8.2011
Пользователь №: 2820

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(PAFOS @ 23.8.2012, 10:02) *
Посмотри, что значит SIGFPE вики.


Спасибо за ссылку.


Я не могу понять, почему возникает именно эта ошибка: "попытка выполнения ошибочной арифметической операции". Я же выделяю память, скорее SIGSEGV должно вылететь, если я что-то криво делаю.

Цитата(PAFOS @ 23.8.2012, 10:02) *
И раз уж ты можешь шагнуть в sort, так в чем проблема?
Посмотри где падает и какие значения переменных при падении, ну впрочем че учить, если умеешь пользоваться отладчиком))

Оно падает у меня прямо на следующей строке после вызова функции из библиотеки. Ничего кроме объекта главного окна (с несколькими виджетами на нём), массива, указателя на QLibrary и функцию из библиотеки у меня нет. Массив правильной длины с такими же числами, как на входе, отсортирован. Что ещё можно посмотреть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.2.2025, 10:50