Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

параметры функций в ДЛЛ


col-isaev ©   (2004-11-24 14:51:00) 

Всем привет! Выручайте!
Вздумалось мне сбросить часто употребляемые функции в ДЛЛ, честно говоря - впервые решил попробовать, вот что имею: stdcall говорит что читать параметры функции надо СПРАВА НАЛЕВО, но в примерах порядок параметров одинаковый, и в библиотеке, и в проге, а в моем случае - нужно поменять местами, короче, вот:

В библиотеке так:

{ Расчет К для установки Шлюмберже }
function K_Schlumberger(MN, AB: real): real; stdcall;
var K: real;
   R1, R2: real;
begin
     R1:= AB/2 - MN/2;
     // Получили AM и BN - для симметричной установки они равны
     R2:= AB/2 + MN/2;
     // Получили AN и BM - тоже равны
     K:= Pi*(R1*R2)/MN;
     // Формула из Матвеева для установки Шлюмберже:
     // К = Пи*((AM*AN)/MN)
     if K < 0 then K:= -K;
     K_Schlumberger:= K;
end;

В программе (по по всем доступным мне источникам) должно быть:
function K_Schlumberger(MN, AB: real): real; external 'CNVRT.DLL';

Но в отладчике я увидел, что значения параметров меняются местами при вызове функции.
Что это за фигня?


col-isaev   (2004-11-25 11:25:00) [1]

1. Спасибо всем за кучу советов
2. Нашел опечатку в справочнике, откуда позаимствовал формулу(впрочем, подозревал об ентом сразу) - работает как швейцарские часы.
3. Еще раз спасибо всем


wal   (2004-11-24 16:27:00) [2]

> if K < 0 then K_DDO:= -K;
А если K >= 0 то результат уже не нужно возвращать?
> K:= 2*Pi/(1/AM - 1/AN - 1/BM - 1/BN); //неправильно,
Наверно оптимизатор шалит, так как при положительном результате K дальше не используется.

С уважением.


MBo   (2004-11-24 16:23:00) [3]

Вместо
 K:= 2*Pi/(1/AM - 1/AN - 1/BM - 1/BN);    if K < 0 then     K_DDO:= -K;
сделай
Result:=Abs(2*Pi/(1/AM - 1/AN - 1/BM - 1/BN));


Digitman   (2004-11-24 16:23:00) [4]


> неподключенный ShareMem может всю картину портит?


в дан.конкр.случае ни влиять ни портить чего-то там указание сего модуля не может.


ssk   (2004-11-24 16:07:00) [5]

>Но другая проблема - неправильное значение на выходе, хотя в промежутке все четко

могу ошибаться... неподключенный ShareMem может всю картину портит?


ALEIIIKA   (2004-11-24 16:02:00) [6]

Извините не туда вписал, прощу прощения.


ALEIIIKA   (2004-11-24 16:01:00) [7]

Sandman25 ©   (24.11.04 15:57) [63]
Вы знаете, кто утверждает устав.
И еще в армии не все же люди глупые, военные и умные попадаются.


col-isaev   (2004-11-24 15:56:00) [8]

Спасибо, я просто проглядел в книжке.
Но другая проблема - неправильное значение на выходе, хотя в промежутке все четко
{ Расчет К установки для диполь-дипольной осевой установки }
function K_DDO(AB, MN, OO: real): real; stdcall;
var AM, AN, BM, BN, K: extended;
begin
    AM:= OO + AB/2 - MN/2; // правильно
    AN:= OO + AB/2 + MN/2; // правильно
    BM:= OO - AB/2 - MN/2; // правильно
    BN:= OO - AB/2 + MN/2; // правильно
    K:= 2*Pi/(1/AM - 1/AN - 1/BM - 1/BN); //неправильно,
                                       //получается как 3+2 = 7
    if K < 0 then K_DDO:= -K;
end;

Я не думаю, что тип может портить дело, среда одна и только одна - Д6. Пока не понимаю, почему.


Digitman   (2004-11-24 14:59:00) [9]


> Вздумалось мне сбросить часто употребляемые функции в ДЛЛ


бестолковая затея, если число будущих различных твоих приложений, использующих эту ДЛЛ, будет равно одному-единственному.

но даже во имя блажи следует неукоснимо следовать правилу : декларации соглашений о вызове в вызывающем и вызываемом коде должны полностью соответствовать.
в дан.случае - либо и здесь и там stdcall, либо ни там ни здесь никакого stdcall


VMcL   (2004-11-24 14:59:00) [10]

>> col-isaev  (24.11.04 14:51)

Кроме [1] и [2]:
<offtopic>
 Рекоммендую не использовать тип Real, поскольку в разных версиях Delphi он имеет разную интерпретацию.
</offtopic>


TUser   (2004-11-24 14:56:00) [11]


> В программе (по по всем доступным мне источникам) должно
> быть:
> function K_Schlumberger(MN, AB: real): real; external 'CNVRT.DLL';

Здесь тоже stdcall надо написать.


Ega23   (2004-11-24 14:55:00) [12]

И в DLL StdCall и в программе StdCall. Или и там и там без него.


Наверх

Титульная страница Поиск, карта сайта Написать письмо