Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизНекорректная работа спамятью Найти похожие ветки
← →
Сашко (2003-04-07 02:11) [0]Проблема состоит в следующем. Есть динамический массив Buffer, который используется для чтения-записи в файл поблочно. Программа работает нормально до тех пор, пока не требуется освободить память , занимаемую массивом - возникает исключение AccessViolation. Независимо от того, каким способом я пользуюсь
- Buffer:=nil | Finalize(Buffer) | Buffer: Pointer ...
FreMem(Buffer,size) - результат один и тот же. Отказ от данных процедур не спасает - исключение возникает при выходе из программы (автоматическом освобожении памяти). Может кто-нибудь сталкивался с подобной проблемой и знает как с этим бороться.
З.Ы. Такой же грешок водится и за Си Билдером. Сдается, указатели - для Боланда больная тема.
← →
крот (2003-04-07 05:46) [1]А можно взглянуть на код чтения из файла?
← →
Sha (2003-04-07 08:50) [2]> Сашко (07.04.03 02:11)
> Сдается, указатели - для Боланда больная тема.
Не судите - не судимы будете.
Типичная ошибка начинающих: читать/писать не в выделенный буфер, а в переменную, хранящую адрес выделенного буфера.
← →
Anatoly Podgoretsky (2003-04-07 08:57) [3]Типичная ошибка начинающих: обвинять в всем Борланда, бедный Франк.
← →
Palladin (2003-04-07 10:21) [4]Да уж...
← →
Skier (2003-04-07 16:20) [5]>Сашко
> Сдается, указатели - для Боланда больная тема.
Довольно смело ! :)
1) динамические массивы индексируются с 0
2) динамическому массиву Buffer нужно задать длину
см. SetLength(...)
3) Осмелюсь предположить, что ты неправильно передаёшь
динамический массив Buffer в качестве параметра
нужно так :
SomeFunc(...,Buffer[0],...), а не SomeFunc(...,Buffer,...)
← →
Переяслов Григорий (2003-04-07 17:11) [6]код в студию
← →
Palladin (2003-04-07 17:17) [7]
> Skier © (07.04.03 16:20)
это не смело, это нагло...
← →
Сашко (2003-04-07 18:49) [8]Вот хрестоматийный пример. Кому интересно могу указать первоисточник:
var
Src, Dest: File
Buf: array of byte;
..............................
AssignFile ( Src, "Source" );
Reset( Src, 1 );
AssignFile( Dest , "Dest");
Rewrite( Dest , 1);
size := FileSize(Src);
SetLength( Buf, size );
BlockRead( Src, Buf, size );
BlockWrite( Dest, Buf, size );
CloseFile( Src );
CloseFile( Dest);
Buf := nil;{Обратите внимание - Исключение возникает здесь, либо при выходе из программы, если удалить эту строку}
Правда у этого примера есть маленький комментарий . Цитирую:
" В версии Delphi4 нельзя использовать в качестве буфера динамический массив, что , судя по всему связано с недоработкой процедур BlockRead и BlockWrite. Хотя.. фрагмент...синтаксически безупречен, попытка его выполнения вызовет исключительную ситуацию."
И там же:
" В Delphi5 этот недостаток устранен".
Осмелюсь заметить - у меня Delphi6.
Есть ли у кого нибудь комментарии по этому поводу?
← →
Palladin (2003-04-07 20:38) [9]
> Сашко (07.04.03 18:49)
пример не верен... где ты его раскопал... небось 12 уроков какихнибудь или <делфи за 3 дня без последствий типа "опыт">
var
Src, Dest: File
Buf: array of byte;
...
AssignFile ( Src, "Source" );
Reset( Src, 1 );
AssignFile( Dest , "Dest");
Rewrite( Dest , 1);
size := FileSize(Src);
SetLength( Buf, size );
BlockRead( Src, Buf [Low(Buf)], size );
BlockWrite( Dest, Buf [Low(Buf)], size );
CloseFile( Src );
CloseFile( Dest);
← →
Сашко (2003-04-07 23:56) [10]Стало быть мой вариант неправильный. Странно, что компулятор даже не матюкнулся - мол, неправильное проиведение типов. Все таки есть разница между указателем и элементом массива. Более того, все это безобразие работало, пока не потребовалось освободить память. В Си такие дела не проходят.
Спасибо за поддержку.
← →
Palladin (2003-04-08 00:02) [11]а вот за такое авторам надо коечто открутить против резьбы...
если ты конечно правильно выдержку привел...
" В версии Delphi4 нельзя использовать в качестве буфера динамический массив, что , судя по всему связано с недоработкой процедур BlockRead и BlockWrite. Хотя.. фрагмент...синтаксически безупречен, попытка его выполнения вызовет исключительную ситуацию."
тебе же советую почитать нормальные книги, и понять чем отличается Buf от Buf[Low(Buf)];
← →
А (2003-04-08 03:46) [12]Удалено модератором
← →
Борланд (2003-04-08 07:06) [13]Удалено модератором
← →
Слесарь Матерящийся (2003-04-08 09:48) [14]>Такой же грешок водится и за Си Билдером
Вот уж неправда...
← →
icWasya (2003-04-08 12:12) [15]>>.. фрагмент...синтаксически безупречен
если посмотрите описание BlockRead, то второй параметр описан как
Var Buf ;
то есть можно подсунуть всё что угодно, лишь бы была переменная.
поэтому самое главное -
>>понять чем отличается Buf от Buf[Low(Buf)];
для статических массивов разницы никакой, поэтому и сбивает с толку.
← →
Palladin (2003-04-08 13:41) [16]
> icWasya © (08.04.03 12:12)
никто не спорит, просто слишком много процитировал
вот за это, голову рвать надо
"В версии Delphi4 нельзя использовать в качестве буфера динамический массив, что , судя по всему связано с недоработкой процедур BlockRead и BlockWrite."
авторы видимо сами не понимают разницы между Buf и Buf[Low(Buf)]
← →
Сашко (2003-04-08 15:06) [17]Даю первоисточник. Фаронов В.В Delphi 5.Учебный курс.-М.:"Нолидж"("знание", понимаешь:-),2000.
Допускаю, что ,возможно, были ошибки в наборе. Я такие там находил. Хотя, вобщем , книжка толковая.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c