![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При вызове функции из dll параметры меняются местами... [D7, Win95/98]
Kolan © (2005-06-30 12:18:00)Здравствуйте,
Такая вот проблемма. Есть ф-ция она находится в dll.
function EvalCapacityKoeff(ResonanceFrequency,
AntiResonanceFrequency: Double;
QualityFactor: Double; var Error: Boolean): Double;
var
Numerator, Denominator: Double;
B: Double;
begin
Error := False;
try
B := AntiResonanceFrequency / ResonanceFrequency;
Numerator := Sqrt(1 + (4/(QualityFactor*QualityFactor)));
Denominator := (B * B) - 1;
Result := Numerator / Denominator;
except
Error := True;
end;
end;
При её вызове происходит удивительная вешь - параметры меняются местами.
Те при вызове
CapacityKoeff := EvalCapacityKoeff(OutPutResAntiRes[0,0],
OutPutResAntiRes[1,0], QualityFactor, Error);
Параметры такие: (10540, 10770, 2,299). А попадая в dll они такие: (2,299, 10770, 10540). Причем такой "эффект" наблюдается и для других функций из dll.
Для проверки скопировал обявление и саму функцию в главную программу - все нормально (те правильно передалось). Ума не приложу в чем дело.
Kolan (2005-06-30 14:02:00) [1]Благодарю буду знать.
Digitman (2005-06-30 13:05:00) [2]
> что лучьше использовать?
с учетом [6] лучше явно не указывать соглашение (т.е. использовать дифолт-соглашение)
Digitman (2005-06-30 13:00:00) [3]
> Kolan © (30.06.05 12:54) [6]
соглашение stdcall подразумевает передачу параметров исключительно через стек, в то время как при дифолт-соглашении первые три явных параметра (считая слева направо) Делфи-компилятор передает через РОНы eax, edx, ecx
обращение к стеку - это обращение к памяти, что менее производительно, нежели обращение к РОН
Kolan (2005-06-30 12:54:00) [4]
> Digitman © (30.06.05 12:29) [5]
Вобщето нет. А что есть большая разница. Если да то в чем? В скорости? Тогда что лучьше использовать?
Digitman (2005-06-30 12:29:00) [5]
> stdcall забыл
а нашута тебе stdcall ?
в перспективе - использование твоей dll в с-шных программах ?
Kolan (2005-06-30 12:27:00) [6]Благодарю очень выручили. Просто обявления написал, а сами фкункции скопировал из старого проекта, ну и stdcall забыл везде поставить. :)))
Poirot (2005-06-30 12:21:00) [7]Проблема ИМХО в соглашениях о вызовах - calling conversions...
Гаврила (2005-06-30 12:19:00) [8]Смотри соглашения о вызовах (stdcall и прочие)
они должны совпадать при объявлении функции в DLL и в хосте
Digitman (2005-06-30 12:19:00) [9]нарушено соответствие соглашений о вызове ф-ции в вызывающем и вызываемом коде