Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается согласовать работу приложения и dll, не все функции возвращают значения 
V
    Опции темы
Курсант
Дата 5.6.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



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

Суть проблемы - есть dll, в ней три функции, все три возвращают тип данных float, параметров не принимают. Одна из функций (вторая) возвращает единицу. Подключаюсь динамически к dll, получаю указатели на все три функции. Поочередно вызываю их и вывожу получаемые от них значения на график. В итоге вторая функция возвращает единицу, а первая и третья - нуль (Хотя нуль они не могут возвращать).
На случай если правильно удалось подключиться только к второй функции, поменял в исходнике dll логику второй функции, чтобы она выдавала всякие дробные значения - в итоге и вторая функция стала выдавать нуль. Вопрос - что за глюк? Может это разные формы представления типа float в dll и в моей программе?  dll скомпилирована на gcc, а программа в C++ Builder 6.0. 
З.ы. На предыдущей программе все работало, но я потерял исходники и теперь переписываю заново, и вот, такой глюк :(
Исходник прилагаю...
Код

   // Моделируем процесс во времени с шагом fStep
   for (float t=fFrom; t<=fTo; t += fStep) {
       // В библиотеке вызываем изменение состояния объекта, соответствующее интервалу времени fStep 
       DisturbSystem (fStep);
       // Теперь начинаем считывать параметры объекта после изменения состояния
       for (int i=0; i<iNumOfParams; i++) {
          int y = 1000*GetParams[i] ();  // Массив указателей на функцию из 3-х элементов. При этом 2-я функция всегда возвращает единицу.
          int iT = 1000*t;
          chtReaction->Series[i]->AddXY( iT, y ); // в итоге на графике получаю вторую прямую на уровне единицы и первую и третью прямые на уровне 0.
       }
   }


Это сообщение отредактировал(а) Курсант - 5.6.2011, 18:11
PM ICQ Skype   Вверх
Курсант
Дата 5.6.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Я использовал при загрузке библиотеки LoadLibrary... А в библиотеке используются глобальные переменные... Может ли быть, что LoadLibrary - неподходящая функция для запуска dll и ее работы с собственными глобальными переменными?

Это сообщение отредактировал(а) Курсант - 5.6.2011, 18:53
PM ICQ Skype   Вверх
borisbn
Дата 5.6.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Прописан ли явно тип вызова функций (__cdecl, __stdcall)?
Если нет, то нужно прописать. 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Курсант
Дата 5.6.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Спасибо за ответ. Прописан __stdcall. Пробовал по-всякому.. и __fastcall, и __stdcall, и __cdecl, и WINAPI, и везде одно и то же получается.
Сейчас удивился в очередной раз. Вывожу глобальную переменную времени из библиотеки таким же образом - время отсчитывается нормально (т.е. глобальная переменная времени в библиотеке накапливается). При этом время инкрементируется на стотысячные доли секунды...
Все больше склоняюсь к тому, что форма представления чисел с плавающей точкой разная, но ведь это наверняка процессорный стандарт, и никак он различаться не может...

Судя по наблюдениям, в ноль обращаются переменные, при вычислении которых в библиотеке используется операция умножения... Может и правда мантиссы как-то переподгоняются при умножении..

Это сообщение отредактировал(а) Курсант - 5.6.2011, 19:25
PM ICQ Skype   Вверх
borisbn
Дата 5.6.2011, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Покажи исходники функций из библиотеки. И ещё: а как ты объединил чисто линуксовый gcc и чисто виндузёвый builder? Или ты имел в виду minGW?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
afiskon
Дата 5.6.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: нет
Всего: 4



В отладчике (каком-нибудь OllyDbg) посмотреть, что происходит, можете? Пробовали собрать библиотеку и программу одним компилятором? Проблема только с float, или также с double?
PM MAIL WWW   Вверх
Курсант
Дата 6.6.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



эммм... пока проблема только с float... использовать один компилятор для библиотеки и для программы я не могу - к программе подключаются разные библиотеки. У всех у них одинаковые по названию функции внутри, но разный алгоритм преобразования. И компилировать их просто необходимо в gcc. А программа писана в Builder'e и если бы был способ эту программу компилировать с помощью gcc, я бы откомпилировал...

Может попробовать другой Builder? У меня есть старая программа, тоже на Builder'e, но кажется с другого дистрибутива... Там, на этой программе, все работает... А на новой - не работает...

Библиотеку прилагаю... model.c
Код

#include<math.h>

float K;
float A, B, C;
float x, g;
float y;
float t;

void ClearVariables () {
t=0;
K=2;
x = 2;
}

void DisturbSystem (float dt) {
g=1;
A = 1;
B = K*dt;
C = 1;
x = A*x+B*g;
y = C*x;
t += dt;
}

float GetParam0(){
return y;
}

float GetParam1(){
return g;
}

float GetParam2(){
return t;
}

float GetParam3(){
return A;
}


model.h
Код

#define EXPORT __declspec(dllexport)
EXPORT void ClearVariables ();
EXPORT void DisturbSystem (float);
EXPORT float GetParam0();
EXPORT float GetParam1();
EXPORT float GetParam2();
EXPORT float GetParam3();


Добавлено через 1 минуту и 33 секунды
всмысле, с double я пока не проверял. Попробую сделать отладку в Olly, о результатах отпишусь позже...
PM ICQ Skype   Вверх
borisbn
Дата 6.6.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Всё-таки явного типа вызова у тебя нет…
Так как у тебя получилось объединить чисто линуксовый и чисто виндузёвый компилятор? 

А ClearVariables точно вызывается? 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Курсант
Дата 6.6.2011, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



Не знаю насчет подружить - я использую компилятор gcc для windows...
Проверяю насчет вызова ClearVariables...

Добавлено через 2 минуты и 47 секунд
Блин smile)) Йолки палки smile Только не бейте ) Только не ногами smile Только не по лицу smile

Я забыл вызвать ClearVariables... Все заработало smile Спасибо всем )) 
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.