Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Снова Access violation, помогите чайнику 
V
    Опции темы
albi
Дата 24.10.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.10.2006

Репутация: нет
Всего: нет



Плиз, помогите понять в чем ошибка:
есть ddl-ка с функцией f1() параметром, которой является массив
В проекте при вызове этой функции возникает ошибка "Project Project1.exe raised exeption class EAccessViolation with message 'Access violation at adress 00D23540. Read of adress..'..'"
Как я поняла '003D23540' есть handle на саму функцию f1, хотя связывание происходит нормально.
На каком этапе ошибка, при компиляции самой ddl-ки ошибок нет!

PM MAIL   Вверх
Snowy
Дата 24.10.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(albi @  25.10.2006,  00:37 Найти цитируемый пост)
Как я поняла '003D23540' есть handle на саму функцию f1,
Нет, это адрес размещения массива в памяти.

Цитата(albi @  25.10.2006,  00:37 Найти цитируемый пост)
есть ddl-ка с функцией f1() параметром, которой является массив
Попробуй передавать массив, как var.
А лучше покажи код - может там ошибка.
PM MAIL   Вверх
albi
Дата 25.10.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.10.2006

Репутация: нет
Всего: нет



Вообще тут целый массив из функций, буду более подробно:
здесь вроде ошибок нет - загружаем библиотеку и все функции

Код

lib:= LoadLibrary('mylib.dll');
for i:=1 to kol_ve do begin
 @mf[i]:=GetProcAddress(lib,pchar('f'+inttostr(i)));

//Потом инициализируем серии, потому что цель - построение графиков функций mf[i]:
 mas_ser[i].Clear;
 mas_ser[i].Title:=form1.StringGrid1.Cells[1,i-1];
 form5.Chart1.AddSeries(mas_ser[i]);

// и поехали строить
tt:=0;
repeat 
for i:=1 to kol_ve do z[i]:=mf[i](z)
for i:=1 to kol_ve do mas_ser[i].addxy(tt,z[i])
tt:=tt+h;
until tt>Tk;


Даже если пытаюсь просто вычислить значение функций в некоторой точке опять эты ошибка!
а в самой ddl-ке, например f1:
Код
Function k1(T:real):real;
begin
k1:=k0[1]*exp(E[1]*(1-T_op/T)/(R*T_op));
end;
...
Function w1(c:mas):real;
begin
w1:=k1(c[kol_ve+1])*c[1];
end;
...
function f1(z:mas):real;stdcall;
begin
f1:=-w1(z);
end;


Боюсь, что таким кодом можно только запутать, вряд ли что-то становится понятней?!

Добавлено @ 00:02 
Вообще тут целый массив из функций, буду более подробно:
здесь вроде ошибок нет - загружаем библиотеку и все функции

Код

lib:= LoadLibrary('mylib.dll');
for i:=1 to kol_ve do begin
 @mf[i]:=GetProcAddress(lib,pchar('f'+inttostr(i)));

//Потом инициализируем серии, потому что цель - построение графиков функций mf[i]:
 mas_ser[i].Clear;
 mas_ser[i].Title:=form1.StringGrid1.Cells[1,i-1];
 form5.Chart1.AddSeries(mas_ser[i]);

// и поехали строить
tt:=0;
repeat 
for i:=1 to kol_ve do z[i]:=mf[i](z)
for i:=1 to kol_ve do mas_ser[i].addxy(tt,z[i])
tt:=tt+h;
until tt>Tk;


Даже если пытаюсь просто вычислить значение функций в некоторой точке опять эты ошибка!
а в самой ddl-ке, например f1:
Код

Function k1(T:real):real;
begin
k1:=k0[1]*exp(E[1]*(1-T_op/T)/(R*T_op));
end;
...
Function w1(c:mas):real;
begin
w1:=k1(c[kol_ve+1])*c[1];
end;
...
function f1(z:mas):real;stdcall;
begin
f1:=-w1(z);
end;


Боюсь, что таким кодом можно только запутать, вряд ли что-то становится понятней?! 
PM MAIL   Вверх
albi
Дата 25.10.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.10.2006

Репутация: нет
Всего: нет



Вопрос в продолжение, возможно, что ошибка возникает из-за вызова в функции f1 функции w1 и прога просто не находит ее?
надо функцию w1 объявлять в public?
PM MAIL   Вверх
Alexeis
Дата 25.10.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(albi @  25.10.2006,  08:43 Найти цитируемый пост)
надо функцию w1 объявлять в public? 

Это как? Это же функция, а не метод класса.

Предполагаю, что дело в соглашении о передаче параметров StdCall
И прототип и сама функция в библиотеке должны (или оба не должны) быть объявлены с этой директивой, иначе происходит неверное обращение к памяти.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sansa
Дата 25.10.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 18.10.2006
Где: Королев

Репутация: 3
Всего: 6



Что за тип "mas"? Я не нашел его определения. Так же как и большинства остальных переменных. Кстати, неизвестно как в dll попадает переменная kol_ve...
Но, ладно. Приведу общие принципы (свои) в подобных случаях. Итак, так как я не видел определения mas, то советую ПЕРВЫМ юнитом проекта (dll) поставить ShareMem. Затем, не закрывая проекта, идем в меню Run - Parameters, устанавливаем HostApplication (тот exe, которым ты тестишь dll), устанавливаем бряку в теле функции fl, нажимаем F9, и смотрим, что передается в качестве параметра. Но в целом, я бы советовал передавать указатель на массив, и число элементов, иными словами:

Код

type
  TMyArray = array [] of double;
  PMyArray = ^TMyArray;


function FL(APMass: PMyArray; ACount: Integer): Double;
begin
  ... // Do Some
end;

procedure TestFL();
var
  LMass: TMyArray;
begin
  FL(@LMass, High(LMass));
end;  


--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
albi
Дата 25.10.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.10.2006

Репутация: нет
Всего: нет



Спасибо огромное за содействие, разобралась. Ответ в моем случае был проще!
mas - это тип который описан в модуле data, и большинство остальных переменных также описаны в этом модуле - этакий модуль с глобальными переменными.
Так вот в функциях f[i],w[i],k[i] используются эти переменные.
Получилось что dll-ка компилируется раньше чем файл data загружаются значения всех переменных, и в функции k1 происходит деление на 0 (потому что значение переменной T_op не передалось!) оттуда все ошибки и пошли.
Дописала процедуру в которой фактически инициализирую все переменные и только после этого вызываю все нужные функции.


Цитата(Sansa @  25.10.2006,  09:47 Найти цитируемый пост)
Но в целом, я бы советовал передавать указатель на массив, и число элементов, ...

Спасибо за замечание, обязательно приму к сведению. 

СПАСИБО!!! Большое спасибо, Snowy, alexeis1, sansa!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.