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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.04 c
15-1187266184
Nic
2007-08-16 16:09
2007.09.16
2 версии PHP на 1 сервер


15-1185638433
anton773
2007-07-28 20:00
2007.09.16
все подключения


4-1164557096
dreamse
2006-11-26 19:04
2007.09.16
Как можно поместить свою надпись поверх чужого окна ?


15-1187596793
Sergey Masloff
2007-08-20 11:59
2007.09.16
Задачка. Контекстно-свободная грамматика для римских чисел.


15-1185599882
IMHO
2007-07-28 09:18
2007.09.16
Шведский стол





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