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

Вниз

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

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

Наверх




Память: 0.55 MB
Время: 0.032 c
1-54635
Opera
2003-04-08 06:37
2003.04.17
Перемещение формы


1-54711
DmTsaplin
2003-04-04 17:19
2003.04.17
DBGrid не получает фокус ввода


9-54388
STANT
2002-10-16 17:22
2003.04.17
Игра


14-54880
Карелин Артем
2003-04-02 09:01
2003.04.17
Что за инфа в отклике сервера?


3-54509
npAKTuk
2003-03-30 20:50
2003.04.17
Datasources