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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2009, 21:58   #1
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию библиотека в Делфи))

создаю свою ДЛЛ но когда наживаю Ctrl+F9 выбивает ошибочку

[Error] MyDLL.dpr(43): Declaration expected but identifier 'Factorial' found

когда в ДЛЛ 1 функция все норм(( когда добавил Factorial вот такой парадокс получился))


текст:
Код:
library MyDLL;
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes;
type Tmasiv=array[1..1000] of real;
{$R *.res}

function SqrtSymSqr(a:Tmasiv;n:integer):real; stdcall;
var sym:real; i:integer;
begin
      sym:=0;
      for i:=1 to n do
       sym:=sym+sqr(a[i]);
       Sym:=sqrt(sym);
      SqrtSymSqr:=sym;
end;

function Factorial(k:integer):LongInt; stdcall;
var F:LongInt; j:integer;
begin
F:=1;
if (k<>0) and (k<>1) then
 for j:=1 to k do
  F:=F*j;
Factorial:=F;
end;

exports
SqrtSymSqr;
Factorial;

begin
end.
Ti_pain) вне форума Ответить с цитированием
Старый 22.12.2009, 22:01   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Что за чудо:
Код:
Factorial:=F;
Про Result не слыхали?

З.Ы. Аналогично и в function SqrtSymSqr...
mihali4 вне форума Ответить с цитированием
Старый 22.12.2009, 22:06   #3
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

Чет не понял?

когда не было 2 функции было все Ок, и при таком коде...
Ti_pain) вне форума Ответить с цитированием
Старый 22.12.2009, 22:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Что за чудо:
старый синтаксис...там можно писать

Код:
exports
SqrtSymSqr,
Factorial;
тут была ошибка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2009, 22:09   #5
AlexanderKs
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 60
По умолчанию

В разделе exports процедуры и функции перечисляются через ",":

Код:
exports
  SqrtSymSqr,
  Factorial;
Хм. С exports разобрались. Опоздал маленько с ответом)

Последний раз редактировалось AlexanderKs; 22.12.2009 в 22:15.
AlexanderKs вне форума Ответить с цитированием
Старый 22.12.2009, 22:12   #6
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

AlexanderKs

Ух.... Спасибки большое) так тупануть... главное в дальнейшем не делать таких ошибок))
Ti_pain) вне форума Ответить с цитированием
Старый 23.12.2009, 00:14   #7
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

У меня появился ище один вопросик((

одна функция в ДЛЛ использует модуль Math(мне кажется из-за етого глюк) - откомпелировалась норм!!
потом в додатке(бычном) все функ кроме етой работают, а ето неа((

код ДЛЛ:

Код:
uses
  SysUtils,Classes,Math;

type Tmasiv=array[1..1000] of real;
var i:integer;
{$R *.res}

function SerGeometr(a:Tmasiv; n:integer):real;
var m:real;
begin
m:=1;
 for i:=1 to n do
  m:=m*a[i];
  m:=Power(m,(1/n));
  SerGeometr:=m;
end;
код додатка:

Код:
function SerGeometr(a:Tmasiv; n:integer):real; stdcall;
var
  ..........
   a:Tmasiv; n:integer;  r:real;
implementation
       function SerGeometr; external 'MyDLL.dll';
  ...............
procedure TForm1.Button1Click(Sender: TObject);
begin

a[1]:=1;
n:=1;
r:=SerGeometr(a,n);
end;
............
Ti_pain) вне форума Ответить с цитированием
Старый 23.12.2009, 00:19   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в ДЛЛ у вас stdcall есть?
Код:
function SerGeometr(a:Tmasiv; n:integer):real;
а из основной проги почему то как stdcall вызываете.
Код:
function SerGeometr(a:Tmasiv; n:integer):real; stdcall;
почитайте в вики Соглашение вызовов
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД библиотека Arkuz БД в Delphi 125 13.10.2010 16:05
Библиотека процедур Paradoxer Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 14.09.2010 12:12
Библиотека boost nazavrik Общие вопросы C/C++ 3 08.12.2009 22:23
Библиотека на Си odi_noki Общие вопросы C/C++ 6 16.04.2009 23:27
библиотека TK и Ruby kpp2 Ruby 5 22.12.2007 02:02