Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Внизвопрос про динамику Найти похожие ветки
← →
step1k © (2005-10-03 00:43) [0]Люди, подскажите как лучше осуществить.
Есть Запись, в которой хранятся параметры каждого объекта:
MyObject = record
height, length, plotnost : double
...
и т.д.
...
end;
Но таких объектов у меня до фига.
Применять метод
VseObjects = array of MyObject;
непозволительно (т.к. записи формируются в стеке, а если записей тысяча) (кстати, число записей изменяется динамически, в каждой задаче оно свое).
Нельзя ли MyObject сделать, что-ли, в форме указателя? Что подскажете сделать и по возможности пожалуйста приведите примеры.
← →
Eleepod (2005-10-03 00:57) [1]Здесь, наверное, лучше использовать динамические списки.
Type U = ^Zveno;
Zveno = Record
Inf : BT;
Next: U End;
Основные моменты:
1. Добавление звена в начало списка
{Процедура добавления звена в начало списка; в x содержится добавляемая информация}
Procedure V_Nachalo(Var First : U; X : BT);
Var Vsp : U;
Begin
New(Vsp);
Vsp^.Inf := X;
Vsp^.Next := First; {То звено, что было заглавным, становится вторым по счёту}
First := Vsp; {Новое звено становится заглавным}
End;
2. Удаление звена из начала списка
{Процедура удаления звена из начала списка;
в x содержится информация из удалённого звена}
Procedure Iz_Nachala(Var First : U; Var X : BT);
Var Vsp : U;
Begin
Vsp := First; {Забираем ссылку на текущее заглавное звено}
First := First^.Next; {То звено, что было вторым по счёту, становится заглавным}
X := Vsp^.Inf; {Забираем информацию из удаляемого звена}
Dispose(Vsp); {Уничтожаем звено}
End;
3. Добавление звена в произвольное место списка, отличное от начала (после звена, указатель на которое задан)
{Процедура добавления звена в список после звена,
на которое ссылается указатель Pred;
в x содержится информация для добавления}
Procedure V_Spisok(Pred : U; X : BT);
Var Vsp : U;
Begin
New(Vsp); {Создаем пустое звено}
Vsp^.Inf := X; {Заносим информацию}
Vsp^.Next := Pred^.Next; {Теперь это звено ссылается на то,
что было следом за звеном Pred}
Pred^.Next := Vsp; {Теперь новое звено встало вслед за звеном Pred}
End;
4. Удаление звена из произвольного места списка, отличного от начала (после звена, указатель на которое задан)
{Процедура удаления звена из списка после звена,
на которое ссылается указатель Pred;
в x содержится информация из удалённого звена}
Procedure Iz_Spiska(Pred : U; Var X : BT);
Var Vsp : U;
Begin
Vsp := Pred^.Next; {Забираем ссылку на удаляемое звено}
{Удаляем звено из списка, перенаправив ссылку на следующее
за ним звено}
Pred^.Next := Pred^.Next^.Next;
X := Vsp^.Inf; {Забираем информацию из удаляемого звена}
Dispose(Vsp); {Уничтожаем звено}
End;
Ну а дальше сам. :)
← →
Defunct © (2005-10-03 01:23) [2]step1k © (03.10.05 00:43)
Я бы вместо MyObject = record, применил бы
TMyClass = class
...
end;
при создании экземпляра сразу будет ссылка, и можно нормально использовать конструкцию array of TMyClass, а можно воспользоваться уже готовыми списком TObjectList (uses Contnrs).
← →
Германн © (2005-10-03 01:34) [3]Задачу - не понял.
Defunct © (03.10.05 01:23) [2] предложил вариант, который я обычно использую, но предпочитаю
TMyClass = class(TObject)
← →
Джо © (2005-10-03 01:36) [4]
> [3] Германн © (03.10.05 01:34)
TMyClass = class(TObject)
TMyClass = class
И какая разница?
← →
Adder © (2005-10-03 01:40) [5]
> Германн © (03.10.05 01:34) [3]
А в чем разница, кроме эстетики? -)
If the declaration of a class type doesn’t specify an ancestor, the class inherits directly from TObject.
type TMyClass = class
...
end;
is equivalent to
type TMyClass = class(TObject)
...
end;
← →
Германн © (2005-10-03 01:51) [6]2 Adder © (03.10.05 01:40) [5]
Нахожусь в процессе Upgrade My Systems :(
D4 пока мне не доступно. И в Д4 так?
← →
Джо © (2005-10-03 02:01) [7]
> [6] Германн © (03.10.05 01:51)
> И в Д4 так?
А есть другие кандидаты на корневой объект? ;)
← →
Defunct © (2005-10-03 02:07) [8]Германн © (03.10.05 01:51) [6]
А проверить?
TMyClass = class
end;
if TMyClass.Create is TObject then
ShowMessage( "Ку")
← →
Германн © (2005-10-03 02:10) [9]2 Джо © (03.10.05 02:01) [7]
Есть. Но не сегодня!
2 Adder © (03.10.05 01:40) [5]
Да и в Д4 справка даёт тот же результат :(
Но где-то, когда-то эти объявления отличались! ИМХО!
← →
Джо © (2005-10-03 02:16) [10]
> [9] Германн © (03.10.05 02:10)
Возможно, твои подозрения были навеяны вот этим
TMyObject = object
end;
Это объявление до сих пор можно применять в Делфи и предком TMyObject в данном случае НЕ будет TObject.
← →
Джо © (2005-10-03 02:18) [11]И, так как классом это не является, к его екземплярам оператор is вообще не приложим. Вот такой вот объект без предка :)
← →
Adder © (2005-10-03 02:26) [12]
> Германн © (03.10.05 02:10) [9]
И в D3,D5, и D6 - тоже так -)
Где-то, когда-то и слова class в Pascal не было (BP7) %)
← →
begin...end © (2005-10-03 08:40) [13]> Defunct © (03.10.05 01:23) [2]
Использовать экземпляр класса только для хранения данных нерационально. Это влечёт за собой замедление производительности. И, главное, вообще противоречит назначению классов.
← →
Defunct © (2005-10-03 09:57) [14]begin...end © (03.10.05 08:40) [13]
Не факт, что потребуется только хранение данных, а в остальном согласен.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.051 c