![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запускаю из среды - нет ошибки. Запускаю ехе - есть :(((
Franzy © (2009-04-23 14:35:00)Столкнулся с совершенно непонятной вещью. Запускаю прогу из среды (Д7) - работает нормально. Запускаю скомпилированный файл - вылазит ошибка Access Violation в библиотеке ntdll.dll. Что за ерунда?
@!!ex (2009-05-01 09:58:00) [1]> [10] AlexDan © (23.04.09 22:37)
> интересно услышать какие. у меня тоже раз такое было. отладка-
> нормально - ехе-нет. там правда речь шла об удалении рабочих
> файлов. но было б интересно услышать что за ограничения
> вообще..
Например, отладкич может выделять дополнительную память. ТОгда FV может и не возникать.
Franzy (2009-04-27 12:39:00) [2]Я имел в виду, что это такое :)
Германн (2009-04-24 21:59:00) [3]
> Franzy (24.04.09 12:24) [11]
>
> 2Германн
> AV?
>
Угу. Именно AV.
Franzy (2009-04-24 12:24:00) [4]2Германн
AV?
AlexDan (2009-04-23 22:37:00) [5]> Игорь Шевченко © (23.04.09 18:51) [8]
> потому что из-под среды программа запускается в режиме отладки,
> а это накладывает свои ограничения
интересно услышать какие. у меня тоже раз такое было. отладка-нормально - ехе-нет. там правда речь шла об удалении рабочих файлов. но было б интересно услышать что за ограничения вообще..
Германн (2009-04-23 19:06:00) [6]AV вообще противная штука в таком случае
> данные писались за конец массива
То она есть, то её нет :(
Игорь Шевченко (2009-04-23 18:51:00) [7]
> Хотя до сих пор в непонятках, почему ошибка не вылазит,
> когда из среды запускаешь прогу...
потому что из-под среды программа запускается в режиме отладки, а это накладывает свои ограничения
Franzy (2009-04-23 16:43:00) [8]Все, нашел ошибку. Когда делал аллокейт памяти для дин. массива в фортране не тот размер передавал, из-за этого данные писались за конец массива... Теперь все нормально. Хотя до сих пор непонятно, почему на ехе ошибка вылазила, а из-под среды - нет.
Franzy (2009-04-23 16:28:00) [9]Так, ошибку локализовал. Что-то при чтении из MMF. При удалении этих строк ошибка перестает вылазить. Буду смотреть дальше.
Хотя до сих пор в непонятках, почему ошибка не вылазит, когда из среды запускаешь прогу...
Anatoly Podgoretsky (2009-04-23 16:12:00) [10]Насколько я знаю, обращение к Фортрану только через указатели, даже если данных один байт, но может что изменилось в последнее время.
Franzy (2009-04-23 16:06:00) [11]Это из интерфейсной части. FSReadGridData - это функция из длл на фортране. В этой строчке я ее объявляю и делаю доступной для основной проги. Если вас смущает _FSREADGRIDDATA@8, то это таким прикольным способом фортран обозначает точки входа в свои длл. 8 - это, кстати, кол-во байт в параметрах. В моем случае - пойнтер на строку и ее длина. Вряд ли проблема в этом, раньше без проблем работало.
Rouse_ (2009-04-23 16:00:00) [12]Откуда вот такая строчка взялась?
> function FSReadGridData(const mapname: PAnsiChar; len :
> longint): longint; stdcall; external 'PKSSolver.dll' name
> '_FSREADGRIDDATA@8';
Franzy (2009-04-23 15:15:00) [13]Кода там несколько тысяч строчек, вряд ли имеет смысл его приводить. Текст ошибки: Access Violation at address XXXXXXXXX in module 'ntdll.dll'. Read of address 00000000.
Меня просто удивляет, что при запуске из среды прога работает, а при запуске как ехе - нет. Трассирование ошибки с помощью лог-файла показало, что вылет имеет место быть при передаче управления вызываемой из длл функции обратно основной программе (сама функция выполянется успешно). Вот фрагмент:
function SendGridData : longint;
var
ec1,ec2 : longint;
begin
ec1 := G2DExportGrid(GridMap);
// эта процедура записывает данные в memory-mapped file GridMap
//процедура из длл, написанной на дельфи
// выполняется успешно
if ec1=0 then
ec2 := FSReadGridData(GridMap,Length(GridMap))
// эта команда считывает данные из файла выше
//процедура из длл, написанной на фортране
// выполняется успешно, судя по логу
else
ec2:=ec1;
//А вот здесь вылетает - сообщение не выводится
showmessage('hello');
if (ec1=0) and (ec2=0) then
begin
G2DFreeGridMap;
G2DFreeMemory;
Result:=0;
end;
Result:=ec2;
end;
//////////////
// А это кусок интерфейсной части проги, на всякий случай приведу:
function G2DExportGrid(const MapName: PAnsiChar): longint; stdcall; external 'PKSGridder2d.dll';
procedure G2DFreeGridMap; stdcall; external 'PKSGridder2d.dll';
procedure G2DFreeMemory; stdcall; external 'PKSGridder2d.dll';
///////////////////////////////
function FSReadGridData(const mapname: PAnsiChar; len : longint): longint; stdcall; external 'PKSSolver.dll' name '_FSREADGRIDDATA@8';
easy (2009-04-23 14:40:00) [14]Она так и останется непонятной, пока не будет кода и полноготекста сообщения об ошибке