Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.193 c
6-1078908684
Janbolat
2004-03-10 11:51
2004.05.02
Serversocet &amp; ClientSocet


1-1081762869
Alexey Chekmezov
2004-04-12 13:41
2004.05.02
Delphi+TComponent


1-1082029201
avgur
2004-04-15 15:40
2004.05.02
Вопрос по кратности значений


1-1082026096
Ivolg
2004-04-15 14:48
2004.05.02
Печать


1-1082001029
bear9
2004-04-15 07:50
2004.05.02
Список выделенных компонентов в Tlistview





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский