Форум: "Начинающим";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Внизвложенность записей Найти похожие ветки
← →
Progger (2005-12-22 20:01) [0]Кошерно ли делать record с несколькими вложениями?
type BAP = record
value, WP : Integer;
end;
type BS = record
R : BAP;
Point : Byte;
end;
type BL = record
A : BS;
Point : Byte;
end;
type BJP = record
A, S, L : BL;
end;
type BASSEF = record
BA1, BA2, BA3, BA4 : BJP;
BB1, BB2, BB3, BB4 : BJP;
{еще много полей Integer, String }
end;
Лучше ли будет сделать класс с такими полями?
← →
umbra © (2005-12-22 20:03) [1]а справку о записях почитать?
← →
Progger (2005-12-22 20:17) [2]
>а справку почитать?
Как-то сухо, стандартно, бюрократично.. на автомодератора похоже. Если хочется сказать хоть что-нибудь, сказал бы: "Иди пивка попей". Человечнее было бы.
← →
Anatoly Podgoretsky © (2005-12-22 20:23) [3]Не то читаешь, читай про TYPE и что будет если его использовать несколько раз.
← →
Progger (2005-12-22 20:35) [4]Из доступной мне книжки:
"Любой из структурированых типов (а в Object Pascal их четыре: объекты, множества записи и файлы) характеризуется множественностью образующих этот тип элементов. Каждый элемент в свою очередь может принадлежать структурированому типу, что позволяет говорить о возможной вложености типов. В Object Pascal допускается произвольная глубина вложености типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2Гбайт."
исходя из этого предполагаю что переменная
B : BASSEF; из представленной в сабже структуры, вполне нормальная вещчь.
Я все делаю правильно?
← →
DrPass © (2005-12-22 21:19) [5]Кошерно, кошерно. Не боись.
← →
Progger (2005-12-22 21:28) [6]
> Кошерно, кошерно. Не боись.
Спасибо.
Еще вопрос. Я создал массив таких переменных:
clients : array [0..9] of BASSEF;
Если написать в редакторе clients[1]. то после точки выпадает список, в котром можно выбрать следуюшее поле. Выбираю: clients[1].BA1. ставлю точку и сейчас уже список не выпадает. Как-то можно заставить его появиться ? Есть в иде какие-то хоткеи для этого?
← →
DrPass © (2005-12-22 21:51) [7]Ctrl+пробел
← →
Progger (2005-12-22 22:22) [8]
> DrPass © (22.12.05 21:51) [7]
Спасибо!
← →
Progger (2005-12-22 22:29) [9]Еще вопрос, а чем будут различаться record и объект класса с такими полями как в структуре в сабже? Есть какое-то принципиальное отличие? Ну, там, по скорости работы, объему, еще почему-нибудь? Или в памяти они одинаково выглядят т.к. поля одинаковые?
← →
DrPass © (2005-12-22 23:07) [10]
> Есть какое-то принципиальное отличие? Ну, там, по скорости
> работы, объему, еще почему-нибудь?
Есть.
1. Запись - по умолчанию статический объект, под него память уже выделена
Экземпляр класса еще нужно создать.
2. По объему - запись содержит только те поля, которые ты в ней объявил. Экземпляр класса как минимум будет хранить еще и все структуры родительского класса TObject.
3. По скорости работы.
Обращаясь к полю записи, ты просто ссылаешься на ячейку памяти.
Обращаясь к полю экземпляра класса, программа ищет сперва адрес, где находится экземпляр, а потом уже смещение этого поля.
Т.е. по всем параметрам эффективности экземпляр класса далеко позади. И если в нем нет необходимости, смело используй записи
← →
Progger (2005-12-22 23:51) [11]
> DrPass © (22.12.05 23:07) [10]
Еще раз большое спасибо!
Я прям чуйствовал что истина где-то здесь и сразу стал использовать записи. ;)
← →
Германн © (2005-12-23 02:14) [12]К DrPass © (22.12.05 23:07) [10]
Я бы ещё добавил. При создании экземпляра класса все его поля инициирутся нулями автоматически. При создании экземпляра записи - инициализация целиком на тебе.
← →
Progger (2005-12-23 05:43) [13]
> Германн © (23.12.05 02:14) [12]
Та-ак. А можно чуть подробнее? Т.е. в FormCreate мне нужно будет обязательно сделать:for i:=0 to {длина массива} do begin
clients[i].BA1.A.R.value:=0
//...и т.д.
clients[i].Str := "";
end;
так чтоли будет правильно? А что может быть если я этого не сделаю? А при закрытии формы убивать записи не нужно?
← →
evvcom © (2005-12-23 09:13) [14]
> 1. Запись - по умолчанию статический объект, под него память
> уже выделена
Очень спорное утверждение. Запись - это тип, а под тип, как известно, нигде ничего не выделено. Под переменную типа запись память выделяется автоматом (хвала компилятору!) Но это все же не объект с точки зрения ООП. Если провести аналогию с объектами (классами), то переменная классового типа - это указатель, поэтому если опишем переменную типа указатель на запись, то здесь тоже никакого автоматического выделения памяти "под запись" не произойдет.
> По объему - запись содержит только те поля, которые ты в
> ней объявил. Экземпляр класса как минимум будет хранить
> еще и все структуры родительского класса TObject
Тоже много спорного. В записи можно также объявить поле типа запись, и тогда она тоже будет содержать нечто ей как бы не очень родное. А экземпляр класса будет содержать все поля и методы родительских классов, т.к. это его поля. Другое дело, что экземпляр класса содержит еще ссылку на тип, где присутствуют различные дополнительные данные (таблицы виртуальных, динамических методов, ссылку на родительский класс и пр.)
> по всем параметрам эффективности экземпляр класса далеко
> позади
Опять спорно. К параметрам эффективности относится не только скорость, и однозначный здесь сделать вывод, имхо, не возможно.
> При создании экземпляра записи - инициализация целиком на
> тебе.
> А можно чуть подробнее?
Ну тоже не совсем верно. Если переменная глобальная, думаю, она будет проинициализирована нулями (не проверял, а сейчас лень). Если локальная, то поля динамического типа (string, динамический массив) будут корректно проинициализированы автоматически. Остальные же поля (статических типов) будут содержать мусор. Проще всего их инициализировать оптом через FillChar.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c