Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2014, 13:19   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Ошибка при передачи двумерного массива в функцию из библиотеки, написанной на СИ (lazarus)

Доброго времени суток. Решил попробовать писать библиотеки на СИ, а вызывать функции из Lazarus.

Строку удалось получить из функции function proverka_double(shstr:string):tata; cdecl; external {libsimplex.a}; . Но когда я передаю двумерный динамический массив double в функцию function sipmlexx(p:baba;m,n:integer):tata;c decl; external {libsimplex.a};, выскакивает ошибка
Цитата:
Проект project1 вызвал класс исключения 'External: SIGSEGV'.

По адресу 7FFFF57343F3
Вот функция, написанная на СИ:

Код:
extern  char *sipmlexx(double **p,int m,int n)
{
simplex aa;
int i,j;
char *s;
aa.m=m;
aa.n=n;

aa.celfun = (double *)malloc((aa.n+2) * sizeof(double));

for(j=0;j<=aa.n;j++)
aa.celfun[j]=p[0][j];
aa.strem=(int)(p[0][aa.n+1]);

aa.mas = (double**)malloc(aa.m * sizeof(double*));
for(i=0;i<aa.m;i++)
aa.mas[i]=(double *)malloc((aa.n + 1) * sizeof(double));

for(i=0;i<aa.m;i++)
for(j=0;j<=aa.n;j++)
aa.mas[i][j]=p[i+1][j];

aa.ogranich=( char *)malloc(aa.m * sizeof( char));
for(i=0;i<aa.n;i++)
aa.ogranich[i]=(int)(p[i+1][aa.n + 1]);

aa.bazisi=( char *)malloc(aa.m * sizeof( char));

aa.error=0;

s=program(aa);

free(aa.ogranich);
free(aa.celfun);	
free(aa.bazisi);	
free(aa.mas);	
return s;
}
Вот, код в Lazarus, где я пытаюсь вызвать функцию sipmlexx:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation
type tata = ^char;
type baba = array of array of double;
  {$L libsimplex.a}
{$R *.lfm}
function proverka_double(shstr:string):tata;cdecl; external {libsimplex.a};
function sipmlexx(p:baba;m,n:integer):tata;cdecl; external {libsimplex.a};
{ TForm1 }

 function proverka_double_laz(arg:string):string;
 var
 g:tata;
 begin
 g:=proverka_double(arg);
 Result:=g;
 end;



procedure TForm1.Button1Click(Sender: TObject);
var
t:baba;
m,n,i,j:integer;
s:string;
k:tata;
begin

s:=proverka_double_laz(Edit1.Text);


if(length(s)=0) then
 begin
  showmessage('Ошибка! Неправильный тип данных');
  Edit1.Text:='';
  Exit;
 end;


 m:=3;
 n:=3;

setlength(t,m+1);

for i:=0 to m do
 setlength(t[i],n+2);


 t[0,0]:=4;
 t[0,1]:=5;
 t[0,2]:=4;
 t[0,3]:=0;
 t[0,4]:=4;

 t[1,0]:=2;
 t[1,1]:=3;
 t[1,2]:=6;
 t[1,3]:=240;
 t[1,4]:=1;

 t[2,0]:=4;
 t[2,1]:=2;
 t[2,2]:=4;
 t[2,3]:=200;
 t[2,4]:=1;

 t[3,0]:=4;
 t[3,1]:=6;
 t[3,2]:=8;
 t[3,3]:=160;
 t[3,4]:=1;


 for i:=0 to m do
  begin
 s:='';
 for j:=0 to n+1 do
  s:= s + floattostr(t[i,j])  + ' ';
showmessage(s);
    end;



 k:=sipmlexx(t,m,n);
 t:=nil;
s:=k;
 showmessage(s);


end;


end.
Ошибка скорее всего в различных индексациях массивов или разном представлении числа в double, но ни real, ни extended работать функцию не заставили. Реально ли вернуть строку из этой функции или здесь так не получится?
ivan.tiran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача двумерного массива в функцию Animaria Общие вопросы C/C++ 5 17.09.2014 01:50
Передача двумерного массива в функцию Negent Общие вопросы C/C++ 4 24.06.2014 00:46
Задача сортировка двумерного массива в lazarus - вариант по возрастанию в Лазарус Ирина Андреевна Пс Lazarus, Free Pascal, CodeTyphon 3 25.08.2013 21:22
Проблемы при передаче двумерного динамического массива в функцию С++ Leiph Общие вопросы C/C++ 1 23.04.2012 13:26
ошибка при передачи данных массива в процедуру chircov090993 Помощь студентам 0 06.11.2010 20:06