Головна сторінка
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;
починати
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;
починати
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.59 MB
Час: 0.053 c
4-1098871748
olevacho
2004-10-27 14:09
2004.12.12
запуск команд під іншим користувачем


14-1099531403
ІМХО
2004-11-04 04:23
2004.12.12
Королівство ночі ...


1-1101793138
DelphiN!
2004-11-30 08:38
2004.12.12
Допоможіть вирішити проблемму з функцією


4-1098222275
AlexeyM
2004-10-20 01:44
2004.12.12
вилов повідомлень


1-1101739912
рем
2004-11-29 17:51
2004.12.12
Створення глобальної змінної Application





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська