Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
7-54932
max2057
2003-02-20 13:14
2003.04.17
CreateFile для CDROM


11-54541
Vitalis
2002-07-02 16:22
2003.04.17
Вопросы по TKOLHTTP и UWrd


8-54749
Noname_
2003-01-16 15:20
2003.04.17
Паразитное окно рендеринга


1-54695
ВДР
2003-04-04 17:50
2003.04.17
изменение цвета Button


14-54872
dir_er
2003-04-02 03:26
2003.04.17
rulezzz





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