Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Iric
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 18
1

Библиотека dll

08.05.2010, 18:47. Просмотров 616. Ответов 5
Метки нет (Все метки)

Задача звучит так : "Разработать приложение, демонстрирующее вызов из библиотеки dll подпрограмм обработки одномерных целочисленных массивов." В принципе сама задача не сложная, но возникает проблема. При поиске суммы элементов массива и других действий упорно не читается первый элемент, хоть тресни. ПОмогите пожалуйста разобраться. Заранее спасибо!
Вот библиотека
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
library Lib;
 
uses
  SysUtils,
  Classes;
 
function Summ(n:integer;a:array of integer):Integer;StdCall;
var i,S:integer;
begin
 S:=0;
 for i:=1 to n do
  S:=S+a[i];
end;
 
exports Summ;
 
function Max(n:integer;a:array of integer):integer;
var M,i:integer;
begin
  M:=a[1];
  for i:=2 to n do
   if a[i]>M then M:=a[i];
  Max:=M;
end;
 
exports Max;
 
function Min(n:integer;a:array of integer):integer;
var M,i:integer;
begin
  M:=a[1];
  for i:=2 to n do
   if a[i]<M then M:=a[i];
  Min:=M;
end;
 
exports Min;
 
{$R *.res}
 
begin
end.
Вот текст программы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
   Mas=array[1..50] of integer;
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Button2: TButton;
    Label4: TLabel;
    Button3: TButton;
    Label5: TLabel;
    Label6: TLabel;
    Button4: TButton;
    Memo1: TMemo;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
function Summ(n:integer;a:array of integer):Integer;StdCall;
function Max(n:integer;a:array of integer):integer; StdCall;
function Min(n:integer;a:array of integer):integer; StdCall;
 
var
  Form1: TForm1;
  n:integer;
  Arr:mas;
 
 
implementation
function Summ; external 'Lib.dll' name 'Summ';
function Max; external 'Lib.dll' name 'Max';
function Min; external 'Lib.dll' name 'Max';
 
{$R *.dfm}
 
function GetSubStr(st:string;k:integer):string;
var i,p:integer;
begin
  for i:=1 to k-1 do
  begin
    p:=Pos(' ',st);
    st:=copy(st,p+1,length(st)-p);
  end;
  p:=Pos(' ',st);
  if p<>0 then result:=copy(st,1,p-1)
          else result:=st
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  n:=StrToInt(Edit1.Text);
  for i:=1 to n do
  Arr[i]:=StrToInt(GetSubStr(Edit2.Text,i));
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var Sum,i:integer;
begin
   Sum:=Summ(n,Arr);
   Label4.Caption:=inttostr(Sum);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var i:integer;
begin
    for i:=1 to n do
    Memo1.Lines.Add(inttostr(arr[i]));
    //SortMas(n,Arr);
    //for i := 1 to n do
    //Memo1.Lines.Add(inttostr(arr[i]));
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var max1,min1,i:integer;
begin
if CheckBox1.Checked=true then
begin
   Max1:=Max(n,arr);
   Label5.Caption:=inttostr(max1);
end;
if checkbox2.Checked=true then
begin
   Min1:=Min(n,arr);
   Label6.Caption:=inttostr(Min1);
end;
end;
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2010, 18:47
Ответы с готовыми решениями:

Пытаюсь сделать динамическую загрузку dll. Dll-библиотека не подает признаков жизни
Здравствуйте. У меня такое дело, я пытаюсь создать в своей программе...

Dll-библиотека
нужно найти min и max из чисел, которые введены в stringgrid (3x3). dll для...

Библиотека dll
Подскажите пожалуйста, как реализовать возможность возведения в степень....

DLL библиотека
Создал DLL библиотеку library Project1; uses SysUtils, Classes, ...

Dll-библиотека
Пишу длл,процедуры табулирования в модуле все работает ,а в библеотеке выдает...

5
Ztrel
446 / 220 / 42
Регистрация: 14.11.2009
Сообщений: 371
08.05.2010, 19:33 2
Попробуйте заменить в коде библиотеки

Delphi
1
2
3
4
5
6
7
function Summ(n:integer;a:array of integer):Integer;StdCall;
var i,S:integer;
begin
 S:=0;
 for i:=1 to n do
  S:=S+a[i];
end;

на


Delphi
1
2
3
4
5
6
7
function Summ(n:integer;a:array of integer):Integer;StdCall;
var i,S:integer;
begin
 S:=0;
 for i:=0 to n-1 do
  S:=S+a[i];
end;
0
Iric
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 18
08.05.2010, 20:46  [ТС] 3
уже пробовала, то же самое

Добавлено через 1 час 1 минуту
ну в принципе проблему исправила так
Delphi
1
2
3
4
5
6
7
function Summa;
var i,S:integer;
begin
   result:=0;
   for i:=Low(arr) to n do
   result:=result+arr[i];
end;
теперь не ищется минимум
0
Puporev
Модератор
55465 / 42572 / 29422
Регистрация: 18.05.2008
Сообщений: 100,714
08.05.2010, 21:02 4
Ну так переделайте все под динамический массив
Delphi
1
2
3
4
 M:=a[0];
  for i:=1 to n-1 do
   if a[i]<M then M:=a[i];
  Min:=M;
1
Iric
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 18
08.05.2010, 21:09  [ТС] 5
Получилось все!!! Спасибо огромное, час голову ломала
0
*~<`PIK`>~*
ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ
606 / 386 / 81
Регистрация: 15.12.2009
Сообщений: 753
09.05.2010, 17:09 6
Проблемы была в том, что в функции - динамический массив(счет с 0) а в вашей программе массив с 1, и когда в функцию попадает массив, то все элементы идут не с 1 а с 0. Ztrel вам дал код который устраняет данную ошибку. А минимальный элемент можно так:
Delphi
1
2
3
4
5
6
7
8
function Min(n:integer;a:array of integer):integer;
var M,i:integer;
begin
  M:=a[0];
  for i:=1 to n-1 do
   if a[i]<M then M:=a[i];
  Min:=M;
end;
0
09.05.2010, 17:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2010, 17:09

DLL библиотека
Помогите реализовать подключение динамической библиотеки к программе unit...

Библиотека DLL
Извините за глупий вопрос... но когда я создал библиотеку Dll у меня в папке...

DLL Библиотека и поток
Создаю ДЛЛ библиотеку и в ней есть функции связаные с работой в интернете, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru