Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: 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 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
4-1099031409
Shiza
2004-10-29 10:30
2004.12.12
Возможно ли если на одной линии находятся модем и телефон


1-1101509172
Артем Владимирович
2004-11-27 01:46
2004.12.12
Как предотвратить копирование из WebBrowser?


3-1100087184
ruslanyd
2004-11-10 14:46
2004.12.12
Среднее между TDBLookupListBox и TListBox


6-1096905757
N.H.
2004-10-04 20:02
2004.12.12
Как можно провер., что стр-ца, откр. брауз-ом - это стр-ца ош-ки?


6-1096904375
Yermek
2004-10-04 19:39
2004.12.12
Удаленный рабочий стол