Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование типа record [D6]


Vlad2 ©   (2002-08-22 06:53:00) 

Здравствуйте !
Подскажите, пожалуйста, кто знает, как создать объект типа record. Что-то не нашел ни в Help, ни в faq.
Необходимо работать с массивом объектов типа record, но как его
создать ? И как уничтожить ?


Dick   (2002-08-22 21:28:00) [1]

To Vlad2 >> TList удобно использовать когда требуется вставить элемент в список.
to Dmitry W. Polschanoff -
Ни разу не получал GPF(To Vlad2 >> General protection failure) при работе с динамическим массивом.


Vlad2   (2002-08-22 10:55:00) [2]

to Dmitry W. Polschanoff
Разъясните, пожалуйста, что есть
>"скозящий" GPF
(global pointer failure ?)


Dmitry W. Polschanoff   (2002-08-22 10:43:00) [3]

To MBo
> динамическому массиву надо явно выделять память вызовом
>
> SetLength, можно обойтись и без ^
> var ar:array of myrec;
> setlength(ar,10);
>ar[0].a:=3;



Реализация динамических массивов в делфи оставляет желать лучшего. Причем начиная во всех версиях, в которых она есть.
Ошибка настолько серьезная, что запросто можно получить
"скозящий" GPF. И режим Debug"а не поможет - показывает вываливание в различных (заведомо правильных) точках программы.


Vlad2   (2002-08-22 09:32:00) [4]

to Digitman
Так и есть, т.е. "Речь о сколь-либо заметном выигрыше может идти лишь тогда, ...", - размер динамического массива по жизни меняется, но не часто.

to Anatoly Podgoretsky
Прекрасная мысль, пратика - критерий истины.

Одноко, кажется, с большой уверенностью можно сказать, что TList - более правильное решение.


Anatoly Podgoretsky   (2002-08-22 09:23:00) [5]

Если статический массив то то сотню миллисекунд на миллион обращений, по сравнению с динамическим или TList.
Почему бы не измерить время на большом цикле.


Digitman   (2002-08-22 09:18:00) [6]

>Vlad2

Не думаю, что выигрыш будет ощутимым. Речь о сколь-либо заметном выигрыше может идти лишь тогда, когда размера твоего массива записей не планируется динамически перераспределять в run-time (т.е. распределяется однократно)


Vlad2   (2002-08-22 09:10:00) [7]

to Digitman
Точно. Всё равно, где-то этот модуль будет будет подключён в
мой Application. Тогда вопрос: верно ли, что использование record
даст выигрыш в скорости обработки (record contra TList) ?


Digitman   (2002-08-22 09:00:00) [8]

>Vlad2


> У меня мания - использовать макс. простые структуры


Если ты подключил (осознанно, по каким-либо иным причинам) модуль classes.pas, нет смысла отказываться от удовольствия воспользоваться тем же TList, ибо неиспользуемый тобой код его все равно "мертвым грузом" тем или иным образом будет включен в АП твоего процесса как неотъемлемый фрагмент подключенного тобой модуля


Vlad2   (2002-08-22 07:50:00) [9]

to Mbo
Отлично !
Надеюсь, и я Вам "когда нибудь пригожусь" (из сказки). Спасибо.


MBo   (2002-08-22 07:42:00) [10]

динамическому массиву надо явно выделять память вызовом SetLength, можно обойтись и без ^

var ar:array of myrec;

setlength(ar,10);
ar[0].a:=3;


Vlad2   (2002-08-22 07:33:00) [11]

to Mbo
У меня мания - использовать макс. простые структуры.
TList содержит методы, которые мне не нужны.
Необходима конструкция (не говорю "объект", следуя Вашему разъяснению), которая только хранит данные, и доступ с элементу хранилища по индексу. Насколько я понял, при работе с record
опасность только в некорректных индексах.


MBo   (2002-08-22 07:24:00) [12]

>Vlad2
>есть объект типа class, объект типа Integer,
в житейском смысле все можно назвать объектами, но в Object Pascal объект - специальный тип, напоминающий записи с методами (процедурами и функциями), скрытием полей, и вся работа с ним ведется только с помощью указательной технологии (обычно объектом назвают экземпляр класса, он является указателем, но ^-синтаксис к нему не нужно применять, это делается автоматически).
Про это нужно, конечно, читать.


>recarray=array[1..10] of myrec;
>// заменю на recarray=array of myrec;
>// т.к. размер массива неизвестен

какая стоит задача?
обрати внимание на списки (TList)


Vlad2   (2002-08-22 07:18:00) [13]

Вдогонку to Mbo:
А почему Вы пишете "Record- не объект" ?
Я так понимаю, что есть объект типа class, объект типа Integer,
объект типа record, объект типа Interface. Существуют лишь
различия в правилах работы с ними и использовании памяти. Или нет ?


Vlad2   (2002-08-22 07:13:00) [14]

to MBo
О! то, что надо.
Сейчас проверю работу с динамическим массивом:

// from Mbo
type precarray=^recarray;

recarray=array[1..10] of myrec;
// заменю на recarray=array of myrec;
// т.к. размер массива неизвестен

var p:precarray;

new(p);
p^[1].a:=3;
delete(p);
//
Значит, я невнимательно читал Help. Спасибо.


gek   (2002-08-22 07:01:00) [15]

type
TRecRaport = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
s:string;
k:word;
z:real;
..........
a:char;
end;

var
Ra:TRecRaport;

begin
Ra:=TRecRaport.Create;
.............
..............
Ra.Free;


MBo   (2002-08-22 07:00:00) [16]

Record- не объект

type myrec=record
a:integer;
b:integer
end;

var ar:array[1..10] of myrec;

если надо динамически создавать:
type precarray=^recarray;
recarray=array[1..10] of myrec;

var p:precarray;

new(p);
p^[1].a:=3;
delete(p);




Наверх

Титульная страница Поиск, карта сайта Написать письмо