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

Вниз

Динамические массивы   Найти похожие ветки 

 
Lera   (2007-08-24 10:21) [0]

Доброе утро! Уменя такая проблема: обнуляю заполнененный динамический массив, каждая ячейка которого содержит разичные параметры разных типов - DnMas:=nil. Возникает ошибка "Invalid pointer operation". Пробовала FreeAndNil(DnMas), та же ошибка. Подскажите что делать? Может как-то по другому обнулять. Заранее спасибо.


 
Юрий Зотов ©   (2007-08-24 10:29) [1]

FreeAndNil - это для объектов. Массив - не объект.

DnMas := nil - это обнуление ссылки на массив (а динамический массив ссылкой и представляется), но не его элементов. Само собой, после обнуления ссылки любое обращение к ней (т.е., к массиву) даст эту самую ошибку.

Обнулить элементы масива можно или в цикле, или так:

var
 DnMas: packed array of тип_элемента;

ZeroMemory(DnMas, Length(DnMas) * SizeOf(тип_элемента));


 
Vlad Oshin ©   (2007-08-24 12:28) [2]

q1:=gettickcount;
for i:=0 to 9999999 do
begin
 k:=length(a);
 setlength(a,0);
 setlength(a,k);
 a[0]:=123;
 a[9]:=321;
end;
q2:=gettickcount;
V1:=q2-q1;

q1:=gettickcount;
for i:=0 to 9999999 do
begin
 ZeroMemory(a, Length(a) * SizeOf(i));
 a[0]:=123;
 a[9]:=321;
end;
q2:=gettickcount;
V2:=q2-q1;

v1>v2 в 4 раза..
почему..

ведь
в1: говорим, размер =0, потом говорим нет, лучше как было
в2: Заполнить массив 0. понимаю что там асм

наверное, машина сама делает v2 неявно?


 
Юрий Зотов ©   (2007-08-24 12:58) [3]

> Vlad Oshin ©   (24.08.07 12:28) [2]

В v2 нет перевыделения памяти, в v1 - есть. Коипилятор - не ИИ и не волшебник, он не знает, что в v1 память можно не перераспределять.


 
Sapersky   (2007-08-24 13:56) [4]

DnMas: packed array of тип_элемента;

packed, вроде, не обязательно, они всегда такие.

наверное, машина сама делает v2 неявно?

Делает. Ну и перераспределение памяти - всегда медленно.


 
Макс Черных ©   (2007-08-24 17:21) [5]


> DnMas := nil - это обнуление ссылки на массив (а динамический
> массив ссылкой и представляется), но не его элементов.

Но это только когда есть еще другие ссылки на массив. А если оных больше нет, то указатель на массив пойдет в процедуру finalize. Которая как раз и зачистит память.


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

Вот в этом  разных типов и зарыта собака. В массиве по уму должны быть элементы одного типа (array of TYPE). А если используется например явное приведение типов (  ТmyType(Еlement) ), или выделение памяти руками и т.п. то и очищать надо руками.
finalize, увы, не всегда может понять, что же там такое программер наваял. :)



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

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.048 c
15-1185015273
Иксик
2007-07-21 14:54
2007.09.16
Лисички


2-1187850968
aalex
2007-08-23 10:36
2007.09.16
открыть файл справкив окне без заголовка


15-1187542819
Сатир
2007-08-19 21:00
2007.09.16
Прога редактирования mp3


15-1187683863
vajo
2007-08-21 12:11
2007.09.16
Покупка лицензионных Win


15-1187471647
timself
2007-08-19 01:14
2007.09.16
Помогите подобрать компонент… RTF-->HTML





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