Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Внизпараметры функций в ДЛЛ Найти похожие ветки
← →
col-isaev (2004-11-24 14:51) [0]Всем привет! Выручайте!
Вздумалось мне сбросить часто употребляемые функции в ДЛЛ, честно говоря - впервые решил попробовать, вот что имею: 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";
Но в отладчике я увидел, что значения параметров меняются местами при вызове функции.
Что это за фигня?
← →
Ega23 © (2004-11-24 14:55) [1]И в DLL StdCall и в программе StdCall. Или и там и там без него.
← →
TUser © (2004-11-24 14:56) [2]
> В программе (по по всем доступным мне источникам) должно
> быть:
> function K_Schlumberger(MN, AB: real): real; external "CNVRT.DLL";
Здесь тоже stdcall надо написать.
← →
Digitman © (2004-11-24 14:59) [3]
> Вздумалось мне сбросить часто употребляемые функции в ДЛЛ
бестолковая затея, если число будущих различных твоих приложений, использующих эту ДЛЛ, будет равно одному-единственному.
но даже во имя блажи следует неукоснимо следовать правилу : декларации соглашений о вызове в вызывающем и вызываемом коде должны полностью соответствовать.
в дан.случае - либо и здесь и там stdcall, либо ни там ни здесь никакого stdcall
← →
VMcL © (2004-11-24 14:59) [4]>>col-isaev (24.11.04 14:51)
Кроме [1] и [2]:<offtopic>
Рекоммендую не использовать тип Real, поскольку в разных версиях Delphi он имеет разную интерпретацию.</offtopic>
← →
col-isaev (2004-11-24 15:56) [5]Спасибо, я просто проглядел в книжке.
Но другая проблема - неправильное значение на выходе, хотя в промежутке все четко
{ Расчет К установки для диполь-дипольной осевой установки }
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. Пока не понимаю, почему.
← →
ALEIIIKA (2004-11-24 16:01) [6]Sandman25 © (24.11.04 15:57) [63]
Вы знаете, кто утверждает устав.
И еще в армии не все же люди глупые, военные и умные попадаются.
← →
ALEIIIKA (2004-11-24 16:02) [7]Извините не туда вписал, прощу прощения.
← →
ssk © (2004-11-24 16:07) [8]>Но другая проблема - неправильное значение на выходе, хотя в промежутке все четко
могу ошибаться... неподключенный ShareMem может всю картину портит?
← →
MBo © (2004-11-24 16:23) [9]Вместо
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) [10]
> неподключенный ShareMem может всю картину портит?
в дан.конкр.случае ни влиять ни портить чего-то там указание сего модуля не может.
← →
wal © (2004-11-24 16:27) [11]> if K < 0 then K_DDO:= -K;
А если K >= 0 то результат уже не нужно возвращать?
> K:= 2*Pi/(1/AM - 1/AN - 1/BM - 1/BN); //неправильно,
Наверно оптимизатор шалит, так как при положительном результате K дальше не используется.
С уважением.
← →
col-isaev (2004-11-25 11:25) [12]1. Спасибо всем за кучу советов
2. Нашел опечатку в справочнике, откуда позаимствовал формулу(впрочем, подозревал об ентом сразу) - работает как швейцарские часы.
3. Еще раз спасибо всем
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c