работа с с++ либой.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

работа с с++ либой.

Сообщение alik1 » 04.04.2007 15:31:13

стoлкнулся с очень странным поведением: есть библиотека устройства, которая прекрасно работает с с++ примером. Делаю то же самое из фпц - и на 4-ый вызов функции из сишной либы, вылетает ексепшн: Invalid floating point operation. Все уже по 150 раз перепроверил и методы вызова и прочее. Ощушение, что фпц какие то свои вещи в реал тайме "навешивает" на эту либу.
Пробовал даже связку: фпц(вылетает с 4-ого раза) приложение/ с++ (ок) приложение <-> с++ библиотека <-> c++ библиотека устройства.
может посоветуете чтонить? компилер и лазарь последние, кернел 2.16.17

Функция вызывается та же самая, в цикле, с теми же параметрами. В сишнике все работает бесконечно.
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Иван Шихалев » 04.04.2007 15:48:44

Тип вызова (stdcall/cdecl или что там...) правильный?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение alik1 » 04.04.2007 15:54:34

Иван Шихалев писал(а):Тип вызова (stdcall/cdecl или что там...) правильный?

да, конечно .. если он не правильный то internal error сыпется и ниче бы с 1-ого раза не заработало
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Attid » 04.04.2007 16:03:34

кусок кода лучше покажи
фпц сам по себе почти ничего и не делает только вызывает разные либы, так что проблем быть не должно. и не важно на чем она написана, главное чтоб правильно написана.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение alik1 » 04.04.2007 16:10:06

Код: Выделить всё
program Project1;

{$mode delphi}{$H+}

{$linklib libwdapi811.so}

uses
  {$IFDEF UNIX}{IFDEF UseCThreads}
    cthreads,  {$ENDIF}  {$ENDIF}
  Classes,
  SysUtils
  { add your units here };

const
  Lib = 'libxxx.so';
 
type
TSensorInfo = packed record
                 SensorVersion : Byte;
                 ImageWidth : Word;
                 ImageHeight : Word;
               end;
               
function STInitialize(hFingerPresent, hFingerLeft : Pointer) : Integer; stdcall; external Lib;
function STOpen(pSensorDescr : Pointer) : Integer; stdcall; external Lib;
function STAuthentify(AlgoID, PassPhrase : PChar) : Integer; stdcall; external Lib;
function STSetWindow(X0, Y0, X, Y, IncX, IncY : Integer) : Integer; stdcall; external Lib;
function STGrabBestSett(Buffer : PChar; BufferSize : LongInt) : Integer; stdcall; external Lib;
function STTerminate() : Integer; stdcall; external Lib;
function STClose() : Integer; stdcall; external Lib;


var PassPhrase : array[0..16] of Char;
    SensorInfo : TSensorInfo;
    XMAX, YMAX : Integer;
    I : Integer;
    image : PChar;

begin
  XMAX := 256;  YMAX := 360;
  GetMem(image, XMAX*YMAX);
  while True do
  begin
    I := STInitialize(nil,nil);
    I := STAuthentify(Pchar('XXXXXXXXXXXXXXXXX'), @PassPhrase[0]);
    I := STOpen(@SensorInfo);
    I := STSetWindow(0, 0, XMAX, YMAX, 1, 1);
    while true do
    begin
      I := STGrabBestSett(image, XMAX*YMAX);
      if I <> -25 then Break;
      Sleep(1000);
    end;
    I := STClose();
    I := STTerminate();
  end;
  FreeMem(image, XMAX*YMAX);
end.



exception HA STGrabBestSett

да код то рабочий ;) в принцыпе под виндой все работает и тестировалось, а вот скорее всего, что фпц все таки какие-то исключения сам пытается обработать или что-то типа

ev: просьба относиться уважительно к тем, кто пытается помогать - оформлять код в специальные теги
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Sergei I. Gorelkin » 04.04.2007 20:04:37

Странно вообще-то, что под Linux используются stdcall вызовы. Не принято оно там...
Запись TSensorInfo - точно packed? Опять же, это не слишком принято в библиотеках.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Иван Шихалев » 06.04.2007 07:36:54

Есть {$PACKRECORDS C}, возможно именно его требуется вместо packed.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru