![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
такая беда:
если определение TRectangleArray перенести во внутрь TRectangle, выводит: [DCC Error] Rectangle.pas(19): E2086 Type 'TRectangle' is not yet completely defined как быть? без указателей возможно обойтись? -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Разве что как-то так....
если функция Split будет назначаться извне или
если будет описана внутри класса Это сообщение отредактировал(а) MetalFan - 27.6.2007, 21:59 -------------------- There are always someone smarter than you... |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
а почему при использовании практически методов ты используешь записи? переходи-таки на классы/объекты, как продемонстрировал товарищ MetalFan
тем более, что для классов есть предварительное объявление(акцентирую внимание автора на втором фрагменте кода, приведенным MetaLFan'ом), а для записей такого нет... |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
да понятно что с классами таких проблем не будет
никаких объективыных сложностей по реализации нормальной поддержки подобных конструкций компилером не вижу. понятное дело, когда массив у нас статический (TRecordArray = array[0..9] of TRecord), то не получится засунуть его в описание самого TRecord, т.к. размер TRecord не известен на момент определения TRecordArray, т.к., сам TRecord содержит TRecordArray. короче, цикличное описание. именно эту щекотливую ситуацию разработчики компилера решили радикально - полным запретом на использование подобных конструкций. в тоже время статический TRecordArray в качестве пареметра одного из методов может быть использован без проблем, т.к. не меняет размер TRecord и передаётся по ссылке, если бы не полное табу наложенное разработчиками. динамический же массив - ссылка на реальные данные и не более того - четыри байта - размер всегда известен, т.е. поле этого типа может без проблем определяться внутри структуры и использоваться методами, но мы имеем всё тоже самое табу. в общем, вот они прелести single-pass компиляторов. тут отчего-то захотелось продолжить монолог темой inline методов\процедур, ну да ладно.. <offtop> на дельфи кодю 10 лет, а вопросы для раздела новичков </offtop> -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
cully,
Мдя... В борландах(CodeGear) могли бы и продумать такую ситуацию... :( Но можно извратиться
Добавлено через 1 минуту и 45 секунд Ход конем так сказать -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
Rennigth, в этом случае, как и в случае использования классов, встаёт вопрос управления памятью, постоянное отслеживание, кто создал TRectangle? кто должен освободить?
ждём новую версию компилера, может там этот вопрос решат, хотя не верится что-то -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Нет. Зачем? Просто при использовании функции(или метода, незнаю как назвать даже) Split, передавай туда твой же TRectangle только с @. Работать с указателем надо будет только в самой Split. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
Rennigth, кхм, в твоём коде, Split возвращает массив указателей, указатели должны на что-то указывать, если они будут указывать на локальные переменные Split, то после выхода из неё локальные переменные удалятся, указатели будут указывать на случайные данные. значит надо GetMem, FreeMem - ручное управление памятью.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
cully, согласен, но нет же ничего сложного если после вызова split перегнать массив указателей в массив рекордов и почистить память первого. Я не говорю что этот вариант хороший. Просто другого способа наверно с текущим вариантом компилятора делфи нету
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
просто вынес метод в процедуру.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |