Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПри вызове функции из dll параметры меняются местами... Найти похожие ветки
← →
Kolan © (2005-06-30 12:18) [0]Здравствуйте,
Такая вот проблемма. Есть ф-ция она находится в 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.
Для проверки скопировал обявление и саму функцию в главную программу - все нормально (те правильно передалось). Ума не приложу в чем дело.
← →
Гаврила © (2005-06-30 12:19) [1]Смотри соглашения о вызовах (stdcall и прочие)
они должны совпадать при объявлении функции в DLL и в хосте
← →
Digitman © (2005-06-30 12:19) [2]нарушено соответствие соглашений о вызове ф-ции в вызывающем и вызываемом коде
← →
Poirot © (2005-06-30 12:21) [3]Проблема ИМХО в соглашениях о вызовах - calling conversions...
← →
Kolan © (2005-06-30 12:27) [4]Благодарю очень выручили. Просто обявления написал, а сами фкункции скопировал из старого проекта, ну и stdcall забыл везде поставить. :)))
← →
Digitman © (2005-06-30 12:29) [5]
> stdcall забыл
а нашута тебе stdcall ?
в перспективе - использование твоей dll в с-шных программах ?
← →
Kolan © (2005-06-30 12:54) [6]
> Digitman © (30.06.05 12:29) [5]
Вобщето нет. А что есть большая разница. Если да то в чем? В скорости? Тогда что лучьше использовать?
← →
Digitman © (2005-06-30 13:00) [7]
> Kolan © (30.06.05 12:54) [6]
соглашение stdcall подразумевает передачу параметров исключительно через стек, в то время как при дифолт-соглашении первые три явных параметра (считая слева направо) Делфи-компилятор передает через РОНы eax, edx, ecx
обращение к стеку - это обращение к памяти, что менее производительно, нежели обращение к РОН
← →
Digitman © (2005-06-30 13:05) [8]
> что лучьше использовать?
с учетом [6] лучше явно не указывать соглашение (т.е. использовать дифолт-соглашение)
← →
Kolan © (2005-06-30 14:02) [9]Благодарю буду знать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c