Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
14-1127899345
Fenix
2005-09-28 13:22
2005.10.23
ТЕдит


2-1127821155
Wolferio
2005-09-27 15:39
2005.10.23
ShellListView


3-1126086871
Term
2005-09-07 13:54
2005.10.23
как в ХП для FB1.5 получить аналогичный результат


6-1120059597
olevacho_
2005-06-29 19:39
2005.10.23
Как Узнать адрес шлюза на компе в локальной сети


14-1127730652
Del_programmer
2005-09-26 14:30
2005.10.23
Профи и любитель





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