Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.17;
Скачать: CL | DM;

Вниз

Некорректная работа спамятью   Найти похожие ветки 

 
Сашко   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
1-54626
Seb_Kost
2003-04-08 06:34
2003.04.17
Преобразование Byte to String


1-54655
Сашко
2003-04-07 02:11
2003.04.17
Некорректная работа спамятью


3-54436
Pat
2003-04-01 14:16
2003.04.17
Подключение к запароленной БД


1-54617
Top Gun
2003-04-07 19:42
2003.04.17
Свойства в классах


6-54784
Sirus
2003-02-17 07:35
2003.04.17
Можно ли получить значение переменной JavaScript из TWebBrowser??