Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизDLL Найти похожие ветки
← →
zenaev (2004-04-17 08:30) [0]Помогите! Надоело уже искать ошибку!
Возникает ошибка "Invalid pointer operation", если А < 1.
В библиотеке функция:function F_Xi2 (x, A : Real; var Flag: Boolean; var Signal: String): Real; Export;
var h, s: Real;
i : Integer;
begin
if A < 1 then
begin
Flag := False;
Signal := "Мало степеней свободы!";
end
else
begin
Flag := True;
if x <= 0 then F_Xi2 := 0 else
begin
h := x / 200;
s := 0;
for i := 1 to 200 do s := s + h * P_Xi2((i - 0.5) * h, A, Flag, Signal);
F_Xi2 := s;
end;
end;
end;
...
Exports
F_Xi2 index 34, ...
В программе объявляю:function F_Xi2 (x, A : Real; var Flag: Boolean; var Signal: String): Real; External "DIST_DLL.dll" index 34;
А это функция, откуда вызываю:function F(x, A, B, C, D: Real; NDist: Word; var Flag: Boolean; var Signal: String):Real;
var r: Real;
begin
case NDist of
0: r := F_Box (x, A, B, Flag, Signal);
1: r := F_Norm (x, A, B, Flag, Signal);
2: r := F_Sharl (x, A, B, C, D, Flag, Signal);
3: r := F_Laplas(x, A, B, Flag, Signal);
4: r := F_LNorm (x, A, B, Flag, Signal);
5: r := F_Veib (x, A, B, Flag, Signal);
6: r := F_Exp (x, A, Flag, Signal);
7: r := F_Relay (x, A, Flag, Signal);
8: r := F_Xi2 (x, A, Flag, Signal); 9: r := F_Xi (x, A, Flag, Signal);
10: r := F_Gamma (x, A, B, Flag, Signal);
11: r := F_Fish (x, A, B, Flag, Signal);
12: r := F_Pareto(x, A, Flag, Signal);
13: r := F_Maxwel(x, A, Flag, Signal);
14: r := F_Stud (x, A, Flag, Signal);
15: r := F_Hotel (x, A, B, Flag, Signal);
16: r := F_Beta1 (x, A, B, Flag, Signal);
end;
Result := r;
end;
Другие функции аналогичны. Ошибка возникает, когда Flag должен быть False.
← →
ЮЮ © (2004-04-17 09:05) [1]>Ошибка возникает, когда Flag должен быть False
В этом случае результат, возвращаемый функцией F_Xi2, вообще не определён, правда непонятно откуда "Invalid pointer operation"
← →
zenaev (2004-04-17 09:59) [2]Да определяла я его уже (просто тупо присваивала 0 в том месте, где флаг становится False)! Все то же...
← →
MBo © (2004-04-17 11:03) [3]uses ShareMem
← →
Sairex (2004-04-17 14:24) [4]Мне кажется что лучше всего передавать не строковое значение
Signal а типа PChar. Поскольку в Delphi не желательно использовать тип String в экспортируемых процедурах Dll.
В полне вероятно, что Ошибку вызывает не эта функция, а P_Xi2.
Если хочешь можешь прислать исходники я попробую разобраться
← →
@Ujin © (2004-04-17 15:01) [5]Думаю Sairex прав, но может и не в этом дело.
можешь заменить заголовок с:
function F_Xi2 (x, A : Real; var Flag: Boolean; var Signal:
String): Real; Export;
на, допустим:
function F_Xi2 (x, A : Real; Flag: ^Boolean; Signal: PChar): Real; Export;
← →
KSergey © (2004-04-17 15:26) [6]> @Ujin © (17.04.04 15:01) [5]
> на, допустим:
>
> function F_Xi2 (x, A : Real; Flag: ^Boolean; Signal: PChar):
> Real; Export;
И что это изменит?
Важно то, что память он выделяет в DLL (путем присвоения значения строке), а использует и, вероятно, освобождает в exe!
Внимательно перечитываем комметарий при создании пустого проекта DLL и MBo © (17.04.04 11:03) [3]
← →
zenaev (2004-04-18 12:31) [7]Спасибо! ShareMem почему-то не помогло, но я заменила тип Signal"а на PChar. Но теперь при закрытии приложения возникает ошибка "Run time error ...". Буду очень признательна, если подскажите, как от нее избавиться.
← →
Digitman © (2004-04-18 12:48) [8]
> Signal := "Мало степеней свободы!";
а это вообще на кой шут делается ?
что, разве вызывающий код, получив как результат вызова ф-ции F_Xi2() зн-е параметра Flag = False, сам не в состоянии сформировать эту строку ? И так ведь понятно, что если флаг = Истина, то результат актуален, иначе - "мало степеней свободы" ... для чего строку-то нужнло возвращать ? при данном алгоритме это попросту избыточная инф-ция, приводящая, кстати, к такому плачевному рез-ту из-за твоего непонимания реальных механизмов распределения памяти в вызывающем и вызываемом коде
← →
Sairex (2004-04-18 16:05) [9]Хммм... не думал, что это поможет. а от ошибки Run time error
можно избавиться путем поледовательной выгрузки приложения
← →
zenaev (2004-04-19 06:47) [10]Стерла в Uses ShareMem. И все работает! Огромное всем спасибо. Хотя интересно, почему же с ShareMem не работало. Насколько я поняла, это надо писать обязательно первой строкой (как я и сделала) в Uses библиотеки и в использующем модуле. Правильно? Или еще что-то (где-то)?
← →
Юрий Зотов © (2004-04-19 07:32) [11]> zenaev (19.04.04 06:47) [10]
1. Если ShareMem Вы использовали ПРАВИЛЬНО, то все должно было работать. Значит, либо Вы использовали его НЕправильно, либо ошибка возникала уже другая. Скорее, первое, потому что ShareMem надо писать обязательно первой строкой в Uses обоих DPR - библиотеки и EXE (именно в DPR, а не в использующем модуле, как Вы говорите).
2. Сейчас Вы сделали неверно, потому что под параметр PChar нужно выделять память (а потом освобождать ее). Вы этого не делали - вот почему была ошибка при закрытии программы. И если сейчас она исчезла, то это чистая случайность, потому что причина не устранена и в любой момент ошибка может появиться снова.
3. Когда Вы создавали проект DLL, то Delphi вставила в его заготовку здоровенный коментарий. Как нетрудно догадаться, она сделала это для того, чтобы Вы этот комментарий ПРОЧИТАЛИ, а не проигнорировали. И если бы Вы потратили на это 5 минут, то не имели бы сейчас никаких проблем.
4. Написала Real. Написала Export. Вставила ShareMem. Заменила строку на PChar. Снова убрала ShareMem. И все это - без понимания того, что оно есть, зачем оно надо, когда и как его нужно (или НЕ нужно) использовать. Скажите, Вам не кажется, что такой способ программирования, по меньшей мере, странен? Может, прежде чем написать слово, лучше посмотреть справку или книжку, чтобы хоть понять, а что же за слово такое Вы написать собираетесь и нужно ли оно здесь? А то не программирование, а шаманство какое-то получается. Пляска с бубном - авось, заработает. Да еще даже не обращая никакого внимания на предупреждения компилятора.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.057 c