Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение типа массива структуры до её описания, record + array of 
V
    Опции темы
stab
Дата 27.6.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



такая беда:

Код

  TRectangleArray = array of TRectangle; // [DCC Error] Rectangle.pas(8): E2003 Undeclared identifier: 'TRectangle'
  
  TRectangle = packed record
  public
    X: Integer;
    Y: Integer;
    Width: Integer;
    Height: Integer;

    function Split(const rect: TRectangle; count: Integer): TRectangleArray; // здесь нужен TRectangleArray, но как его определить?
  end;


если определение TRectangleArray перенести во внутрь TRectangle, выводит: [DCC Error] Rectangle.pas(19): E2086 Type 'TRectangle' is not yet completely defined

как быть? без указателей возможно обойтись?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
MetalFan
Дата 27.6.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Разве что как-то так....
Код

 TRectangle = class( TObject );

  TRectangleArray = array of TRectangle;

  TRectangle = class( TObject )
  public
    X: Integer;
    Y: Integer;
    Width: Integer;
    Height: Integer;
    Split: function (const rect: TRectangle; count: Integer): TRectangleArray;
  end;

если функция Split будет назначаться извне
или
Код

  TRectangle = class( TObject );

  TRectangleArray = array of TRectangle;

  TRectangle = class( TObject )
  public
    X: Integer;
    Y: Integer;
    Width: Integer;
    Height: Integer;
    function Split(const rect: TRectangle; count: Integer): TRectangleArray;
  end;

  function TRectangle.Split(const rect: TRectangle; count: Integer): TRectangleArray;
  begin
  end;

если будет описана внутри класса

Это сообщение отредактировал(а) MetalFan - 27.6.2007, 21:59


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
skyboy
Дата 27.6.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



а почему при использовании практически методов ты используешь записи? переходи-таки на классы/объекты, как продемонстрировал товарищ MetalFan smile
тем более, что для классов есть предварительное объявление(акцентирую внимание автора на втором фрагменте кода, приведенным MetaLFan'ом), а для записей такого нет...
PM MAIL   Вверх
stab
Дата 28.6.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



да понятно что с классами таких проблем не будет smile но нужны именно структуры, это порт внешней библиотеки которая в классах дельфи ни бум-бум. хочется изящества: ExternalFunction(rect), а не: ExternalFunction(rect.RealRect), и свойства враперы, и ненужный overhead по всем операциям: создания, взятия значений, присвоения, т.д. тем более, компилер (D2007) позволяет использовать хитрые структуры, со свойствами\методами\внутреннеми типами. придётся просто вынести метод из структуры в виде обычной процедуры. эх, дельфи-дельфи.. сыро-сыро, так хочется походить на C#, ан нет, всякие мелочи постоянно портят погоду.

никаких объективыных сложностей по реализации нормальной поддержки подобных конструкций компилером не вижу. понятное дело, когда массив у нас статический (TRecordArray = array[0..9] of TRecord), то не получится засунуть его в описание самого TRecord, т.к. размер TRecord не известен на момент определения TRecordArray, т.к., сам TRecord содержит TRecordArray. короче, цикличное описание. именно эту щекотливую ситуацию разработчики компилера решили радикально - полным запретом на использование подобных конструкций.

в тоже время статический TRecordArray в качестве пареметра одного из методов может быть использован без проблем, т.к. не меняет размер TRecord и передаётся по ссылке, если бы не полное табу наложенное разработчиками. динамический же массив - ссылка на реальные данные и не более того - четыри байта - размер всегда известен, т.е. поле этого типа может без проблем определяться внутри структуры и использоваться методами, но мы имеем всё тоже самое табу.

в общем, вот они прелести single-pass компиляторов. тут отчего-то захотелось продолжить монолог темой inline методов\процедур, ну да ладно..  smile 


<offtop>
на дельфи кодю 10 лет, а вопросы для раздела новичков  smile
</offtop>



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Rennigth
Дата 28.6.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



cully, 
Мдя... В борландах(CodeGear) могли бы и продумать такую ситуацию... :( Но можно извратиться smile
Код

  PRectangle = ^TRectangle;

  TRectangleArray = array of PRectangle; // [DCC Error] Rectangle.pas(8): E2003 Undeclared identifier: 'TRectangle'

  TRectangle = packed record
  public
    X: Integer;
    Y: Integer;
    Width: Integer;
    Height: Integer;

    function Split(const rect: PRectangle; count: Integer): TRectangleArray; // здесь нужен TRectangleArray, но как его определить?
  end;



Добавлено через 1 минуту и 45 секунд
Ход конем так сказать  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
stab
Дата 28.6.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



Rennigth, в этом случае, как и в случае использования классов, встаёт вопрос управления памятью, постоянное отслеживание, кто создал TRectangle? кто должен освободить?

ждём новую версию компилера, может там этот вопрос решат, хотя не верится что-то  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Rennigth
Дата 28.6.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(cully @  28.6.2007,  10:10 Найти цитируемый пост)
постоянное отслеживание, кто создал TRectangle?

Нет. Зачем? Просто при использовании функции(или метода, незнаю как назвать даже) Split, передавай туда твой же TRectangle только с @. Работать с указателем надо будет только в самой Split.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
stab
Дата 29.6.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



Rennigth, кхм, в твоём коде, Split возвращает массив указателей, указатели должны на что-то указывать, если они будут указывать на локальные переменные Split, то после выхода из неё локальные переменные удалятся, указатели будут указывать на случайные данные. значит надо GetMem, FreeMem - ручное управление памятью.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Rennigth
Дата 29.6.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



cully, согласен, но нет же ничего сложного если после вызова split перегнать массив указателей в массив рекордов и почистить память первого. Я не говорю что этот вариант хороший. Просто другого способа наверно с текущим вариантом компилятора делфи нету  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
stab
Дата 29.6.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



просто вынес метод в процедуру.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.