Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Вниз

Работа с динамическими массивами   Найти похожие ветки 

 
Konstantionov   (2003-04-03 22:03) [0]

Как за один прием очистить динамический массив? Т.е. присвоить каждому элементу значение 0 не используя перебор. Заранее спасибо.


 
Palladin   (2003-04-03 22:08) [1]

FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)

ЗЫ чего то добрый я сегодня


 
Chlavik   (2003-04-04 03:00) [2]

ZeroMemory


 
Palladin   (2003-04-04 10:14) [3]

Нет такой буквы в этом слове


 
Тимохов   (2003-04-04 12:28) [4]

> Palladin
Наверное все таки так
if Length(Arr) > 0 then
FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)


 
Palladin   (2003-04-04 12:32) [5]


> Тимохов (04.04.03 12:28)

если размер массива будет нулевым (или он не будет инициализированым)
ничего страшного не произойдет ибо ничего не заполнится...
проверка здесь лишняя...


 
Тимохов   (2003-04-04 12:44) [6]

Не лишняя. Обращение Arr[Low(Arr)] может сгенерить access violation. Проверять не стоит, т.к. может и не сгенерить ))).
Обращение будет к адресу 0000 0000. Система вполне пожет расценить это как ошибку.


 
Palladin   (2003-04-04 12:48) [7]

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

var
arr:array of char;
a:integer absolute arr;
begin
a:=0;
FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)
end;

нет его, нет exception;


 
Mike Kouzmine   (2003-04-04 12:52) [8]

А если без а:=0? Помоему High(a), если массив не инициализирован выдет -1. Хотя, как всегда, я могу ошибаться.


 
Тимохов   (2003-04-04 12:52) [9]

Я тебе сказал - проверять не стоит. Это может работать, а может и не работать. Т.к. обращение не корректное.
У тебя какая система?


 
Тимохов   (2003-04-04 12:54) [10]

> Palladin
Обнулять динамические массивы (даже локальные) вообще лишнее. Они и так будут пустыми.


 
Palladin   (2003-04-04 12:55) [11]

а обращения как такого нету... используется лишь адрес A[Low(Arr)] а не сама переменная A[Low(Arr)]

если Count <1 то соответственно вообще никакого заполнения не произойдет, и ничего страшного не случится, поэтому в данной ситуации позвольте с вами не согласится...


 
Palladin   (2003-04-04 12:57) [12]


> Тимохов (04.04.03 12:52)

объясняю
обращения к переменной A[Low(A)] нет, есть лишь обращение к адресу @A[Low(A)] и даже пусть он будет 0000 0000
все равно заполенния не состоится потому что Coun<1

так что позвольте в данной ситуации с вами не согласится


 
Тимохов   (2003-04-04 12:57) [13]

> Palladin
Вообще писать a:=0 не очень хорошо т.к. integer generic type. И вообще говоря нет гарантии, что когда нить он не станет длиной 8.
Лучще использовать LongInt. Хотя обнулять дин массивы, как я писал выше, не надо


 
Palladin   (2003-04-04 12:57) [14]

упс

два раза написал, сорри...


 
Тимохов   (2003-04-04 13:01) [15]

> Palladin
Сойдемся на том, что не будет access violation, но будет range check error ))))))


 
Palladin   (2003-04-04 13:02) [16]


> Тимохов (04.04.03 12:57)

почему ты решил что обнуление происходит в начале?

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

A[1]
A[7]
A[15]
A[32]
A[9]

причем необходимо чтобы элементы кторые я не трогаю были равны нулю
потом начинается следущая итерация и мне нужно очистить весь массив

ну а поповоду a:=0

то есть в данном случае ты не согласен что после a=0
Arr указывает на 0000 0000?
это уж слишком...


 
Palladin   (2003-04-04 13:05) [17]

:)) и Range Check не будет :)
потому что это динамический массив :) границы на нем не проверяются в следствии своей изменчивости :)


 
Тимохов   (2003-04-04 13:07) [18]

1. Про обнуление - это описано в хелпе. Тоже кстати отностися к длинным строкам
2. Про очищение - пиши лучше arr := nil. Почему? Во-первых, так осводождается память из под массива. Во вторых, если у тебя массив дин варинатов, строк, или интерфейсов (или рекордов, кот. содержат указанные типы), то будет отечка памяти. В третьих не нарушается подсчет ссылок на массив.
3. Про a := 0 Весь вопрос в будущей переносимости.


 
Тимохов   (2003-04-04 13:09) [19]

> Palldin. С тобой спорить себе дороже. Я про дин массив и строки знаю ВСЕ. Вплоть до asm кода. Без лишней скромности ))))
Мог бы и послушать. Я на их изучение потратил много времени.


 
Stas   (2003-04-04 13:10) [20]

А может быть так
A:=Nil
Finalize (A)


 
Тимохов   (2003-04-04 13:11) [21]

Не надо писать finalize. Он нуже в одном случае - если работа с память идет напрямую. Через get и free mem


 
Palladin   (2003-04-04 13:14) [22]

а я потратил время на их использование не меньше

и при чем тут дин массив, здесь речь идет о том как поведет себя FillChar при передаче ему адреса для заполнения и длинны для заполнения... дин массив просто в вопросе фигурирует...

точно также я мог бы и передать простой pointer указывающий на 0000 0000 и с размером заполнения 0, точно так же ничего бы не произошло...



> Про a := 0 Весь вопрос в будущей переносимости.

это я пример привел, что бы обнулить... с какой стати мне это использовать...


> С тобой спорить себе дороже. Я про дин массив и строки знаю
> ВСЕ. Вплоть до asm кода. Без лишней скромности ))))
> Мог бы и послушать. Я на их изучение потратил много времени.

ну уж раз мы такие сякие, почему же мы не уловили момента с адресами?


 
Stas   (2003-04-04 13:15) [23]

Ну, насчет Finalize незнаю, но A:=nil лучший вариант чем

FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)


 
Palladin   (2003-04-04 13:18) [24]


> Stas © (04.04.03 13:15)
> Тимохов (04.04.03 13:07)


вы в пример не вдумались
Palladin © (04.04.03 13:02)

мне не нужно его много много раз удалять
мне нужно его именно обнулять


 
Тимохов   (2003-04-04 13:41) [25]

>Palladin
1. Про range check error я сказал не случайно - проверь
2. Про access violation - я уже исправился
3. Про инициализацию локального динамического массива - этого делать не надо
4. Про последующую очистку дин. массива - только := nil или setlength(..., 0)

Все.


 
Тимохов   (2003-04-04 13:48) [26]

> Palldin Про acces violation я дейсвительно погорячился. Приношу свои глубокие сожаления. ))))


 
Palladin   (2003-04-04 14:00) [27]

нет не будет range check error
что то ставит под сомнения твои слова по поводу того что ты знаешь о дин массивах ВСЕ...

var
arr:array of char;
begin
SetLength(Arr,0);
FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)
end;

и вот еще

setlength(arr,0);
i:=-1;
Arr[i]:="a";

возникает именно access violation а не range check error

исполни оба примера и убедись


 
Тимохов   (2003-04-04 14:05) [28]

> Palladin Блин. Тебе asm код дать?
У тебя отключена проверка range check error.


 
Тимохов   (2003-04-04 14:08) [29]

> Palladin.
Тогда корректней писать так
{$RANGECHECKS OFF}
FillChar(Arr[Low(Arr)],(High(Arr)-Low(Arr)+1)*SizeOf(Arr[Low(Arr)]),0)
$RANGECHECKS ON}
А про "ВСЕ" - это так.





 
Palladin   (2003-04-04 14:08) [30]

:)
ну вот с этого и надо начинать


 
Palladin   (2003-04-04 14:09) [31]

тут уж мне придется извинится, из головы вылетело про отключение


 
Palladin   (2003-04-04 14:12) [32]

ок. на том и порешили...

if Length(Arr)

можно пренебречь если отключен range check error
при включеном присутствие этого обязательно если не хотите exception

:)


 
Тимохов   (2003-04-04 14:18) [33]

> Palladin На самом деле все-таки скользкий вопрос
всегда ли нормально работает команда lea <регистр>, [0] (или как-то так). Именно так идет обращение к arr[0] если массив пустой. Не воспримет ли система это за попытку несанкционированного доступа.


 
Sha   (2003-04-04 14:40) [34]

> Тимохов (04.04.03 14:18)
Не воспримет.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
3-54509
npAKTuk
2003-03-30 20:50
2003.04.17
Datasources


3-54488
Совенок
2003-03-27 06:22
2003.04.17
Поля Formatted Memo


11-54537
SPeller
2002-06-29 11:42
2003.04.17
Отлов сообщений форме


1-54603
_User_
2003-04-07 17:12
2003.04.17
Выгрузка приложения


3-54526
den_777
2003-03-31 08:02
2003.04.17
DBExpress и EXCEPTION





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