![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
параметры функций в ДЛЛ
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. Или и там и там без него.