Главная страница
    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.041 c
14-1127972011
Ega23
2005-09-29 09:33
2005.10.23
С днем рождения! 29 сентября


14-1128417104
Вольный Стрелок
2005-10-04 13:11
2005.10.23
Сколько РАЗНЫХ эллипсов можно вписать в прямоугольник?


2-1127728182
Алексей2
2005-09-26 13:49
2005.10.23
Убрать обработчик события


4-1124388955
Piter
2005-08-18 22:15
2005.10.23
Странная работа GetModuleFileName с библиотеками


3-1126111402
MSMEN
2005-09-07 20:43
2005.10.23
Установил ORACLE8j! вроде не вводил пароль





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