Вниз
Скачать: CL | DM;

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

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.021 c
11-1083849539
Delphi5.01
2004-05-06 17:18
2004.12.12
... как вызвать функцию paint предка ...


14-1100943955
cyborg
2004-11-20 12:45
2004.12.12
Обхохотаться можно :)


14-1101062985
ArMellon
2004-11-21 21:49
2004.12.12
Кому нечего делать....выскажите мнение о моем чате


1-1101414806
Mazer
2004-11-25 23:33
2004.12.12
Изменения свойства Enabled у разных компонентов одним махом?


14-1100666946
Megabyte-CeerCop
2004-11-17 07:49
2004.12.12
Потерял ветку про ламаразмы, а спостить нужно.




   Наверх