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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2010, 09:49   #1
Kolan
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 13
По умолчанию Ошибка при передаче массива в DLL и считывание результатов.

В чём ошибка передачи массива в библиотеку и обратно.
Код:
library MyDLL;

uses ShareMem,
  SysUtils,
  Classes;
type rock=array[1..600] of Double;

procedure Rasch(a:Boolean; b,c:Real; d:Integer; var x,y:rock); stdcall;
var g,r,h:Real; i:Integer;
begin
g:=b;
r:=c-b;
h:=r/d;
for i:=1 to d-1 do
begin
x[i]:=g;
if a then
y[i]:=g*g+g+3 else y[i]:=4*g+3;
g:=g+h;
end;
end;
exports Rasch name 'Rasch';

{$R *.res}

begin
end.
Файл программы.
Код:
unit Unit1;

interface

uses ShareMem,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ExtCtrls, ComCtrls;
type
Rock=array[1..600] of double;

type
  TForm1 = class(TForm)
  ...
// все возможные переменные связаные с компонентами
  ...
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure Rasch(a:Boolean; b,c:Real; d:Integer; x,y:Rock); stdcall;
var
  Form1: TForm1;

implementation
  procedure Rasch; external 'MyDLL.dll' name 'Rasch';

{$R *.dfm}

function Size(a,b:Real):Real;
begin
if a<b then Result:=b-a else Result:=a-b;
end;

procedure TForm1.btn1Click(Sender: TObject);
var x1,y1,b,c,g,r,L,K,h:real; a:Boolean; i,d:Integer; x,y:Rock;
begin
b:=StrToFloat(edt1.Text); //Предел начала графика
c:=StrToFloat(edt2.Text); //Конец графика
d:=StrToInt(edt3.Text)+1; //Количество разбиений
if rb1.Checked=True then a:=True else a:=False;
Rasch(a,b,c,d,x,y);
for i:=1 to d-1 do
begin
mmo1.lines.add(IntToStr(i)+' точка');
mmo1.lines.add('x='+FloatToStr(x[i]));
mmo1.lines.add('y='+FloatToStr(y[i]));
end;
end;

end.
Kolan вне форума Ответить с цитированием
Старый 21.11.2010, 10:06   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

в dll модуле объявлено:
Код:
procedure Rasch(a:Boolean; b,c:Real; d:Integer; var x,y:rock); stdcall;
а в приложении:
Код:
procedure Rasch(a:Boolean; b,c:Real; d:Integer; x,y:Rock); stdcall;
var перед x, y : Rock добавь.
maxionans вне форума Ответить с цитированием
Старый 21.11.2010, 11:10   #3
Kolan
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 13
По умолчанию

Я тупанул. Весь день просто писал запарился.

11:14

Хотя всё равно выдают ошубку EOutOfMemory.

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом. Это - флуд.
Читаем правила. Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Уважайте форумчан, и они ответят вам взаимностью...
Модератор

Последний раз редактировалось mihali4; 21.11.2010 в 13:34.
Kolan вне форума Ответить с цитированием
Старый 21.11.2010, 18:04   #4
Bug2000
Пользователь
 
Регистрация: 18.11.2010
Сообщений: 12
По умолчанию

Если используешь ShareMem ( в твоем случае не обязательно )
То помещай первой в файл проекта а не формы
Код:
program testApp;

uses  ShareMem,
  Forms,
  UMain in 'UMain.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Из-за этого вероятно и EOutOfMemory.
Если d это количество точек, то надо было
Код:
for i:=1 to d do
и
h := r / (d - 1);
и посоветовал бы использовать динамические массивы.
Код:
uses
  ShareMem,
  SysUtils,
  Classes;

{$R *.res}

type
  rock = array of Double;

procedure Rasch(a: Boolean; b, c: Real; x, y: rock); stdcall;
var
  g, r, h: Real;
  i: Integer;
  d: Integer;
begin
  d := Length(x);
  if Length(y) <> d then
    raise Exception.Create('Неверно заданы массивы');
  if d < 2 then
    raise Exception.Create('Мало интервалов');
  g := b;
  r := c - b;
  h := r / (d - 1);
  for i := 0 to d - 1 do
  begin
    x[i] := g;
    if a then
      y[i] := g * g + g + 3
    else
      y[i] := 4 * g + 3;
    g := g + h;
  end;
end;

exports Rasch name 'Rasch';
Код:
unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Rock = array of double;

type
  TForm1 = class(TForm)
    btn1: TButton;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    rb1: TCheckBox;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure Rasch(a: Boolean; b, c: Real; x, y: Rock); stdcall;

implementation

procedure Rasch; external 'MyDLL.dll' name 'Rasch';

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  x1, y1, b, c, g, r, L, K, h: Real;
  a: Boolean;
  i, d: Integer;
  x, y: Rock;
begin
  b := StrToFloat(edt1.Text); // Предел начала графика
  c := StrToFloat(edt2.Text); // Конец графика
  d := StrToInt(edt3.Text) + 1; // Количество разбиений
  a := rb1.Checked;
  SetLength(x,d);
  SetLength(y,d);
  Rasch(a, b, c, x, y);
  for i := Low(x) to High(x) do
  begin
    mmo1.lines.add(IntToStr(i) + ' точка');
    mmo1.lines.add('x=' + FloatToStr(x[i]));
    mmo1.lines.add('y=' + FloatToStr(y[i]));
  end;
end;

end.
Bug2000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с DLL _-Re@l-_ Общие вопросы Delphi 1 28.08.2010 20:55
ошибка при передаче ссылки на массив в визуал 2008 LOST94 Общие вопросы C/C++ 7 29.06.2010 22:23
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
Ошибка при загрузке dll nikmay Общие вопросы Delphi 10 25.06.2009 15:42
Ошибка при загрузке DLL dani92 Общие вопросы Delphi 12 24.04.2009 14:54