Форум: "Основная";
Текущий архив: 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.008 c