Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1101261730
Bobby Digital
2004-11-24 05:02
2004.12.12
проверить на тип


1-1101886141
markers
2004-12-01 10:29
2004.12.12
База данных


4-1098642014
Dot
2004-10-24 22:20
2004.12.12
как заменить ресурс


14-1100879277
icebeerg
2004-11-19 18:47
2004.12.12
Поределение точки пересечения прямых


14-1101226867
syte_ser78
2004-11-23 19:21
2004.12.12
Тюльпан из бумаги





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский