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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать forward declaration для record ? 
:(
    Опции темы
klimrmad
Дата 20.7.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.6.2007

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



Дельфи 2007.

Решил воспользоваться записями для облегчения записи векторных операций.
В сильно упрощенном виде выглядит так:
Код

type
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
    // далее описаны векторные операции, в которых иногда используется tPoint
end;
При компиляции вполне ожидаемо ругается на «Undeclared identifier: 'tVector'»

Пытался, по аналогии с классами, добавить forward declaration:
Код

type
tVector = record;
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
end;
Ругается на «'END' expected but ';' found»
В мануалах ничего не нарыл. 
Need help.  smile 


PM MAIL   Вверх
AKATAN
Дата 20.7.2011, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

type
tVector = record;
tPoint = record
    x, y, z: double;
    class operator Inc( p:tPoint ): tVector;
    class operator Dec( p:tPoint ): tVector;
end;
tVector = record
    x, y, z: double;
end;

 smile 

Цитата

type
tVector = record;
 какой смысл несет этот код? 
PM MAIL ICQ   Вверх
klimrmad
Дата 20.7.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.6.2007

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



Цитата(AKATAN @ 20.7.2011,  19:58)
Цитата

type
tVector = record;
 какой смысл несет этот код?

В случае с классами таким образом делается forward declaration. 
C record не прокатывает, вот я и спрашиваю, есть ли нормальный путь, или придется использовать некий третий record в качестве прокси.
PM MAIL   Вверх
AKATAN
Дата 20.7.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

В случае с классами

ты прав. форвардинг классов бы получился. записей - нет.
столь критично использовать рекордс?
PM MAIL ICQ   Вверх
cat512
Дата 21.7.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

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



Так правильно
Код

type
  PPoint = ^TPoint;
  TVector = record
    x, y, z: double;
    P: PPoint;
  end;

  TPoint = record
    x, y, z: double;
  end;

PM MAIL   Вверх
klimrmad
Дата 21.7.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.6.2007

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



Так правильно, если вам надо использовать переменную как поле в записи, а  мне надо его использовать в переназначении операторов.
Этот код при компиляции приводит к ошибке «Incompatible types: 'tVector' and 'pVector'».
Код
type
pVector = ^tVector;
tPoint = record
    x,y,z: double;
    class operator Subtract ( p0,p1:tPoint ): pVector; // Vector = Point - Point
end;
tVector = record
    x,y,z: double;
    class operator Add( p:tPoint;  v:tVector ): tPoint; // Point +- Vector = Point
end;

function Test( p0,p1: tPoint ):double;

implementation

class operator tPoint.Subtract( p0,p1:tPoint ): pVector;
begin
    result.x := p0.x - p1.x;
    result.y := p0.y - p1.y;
    result.z := p0.z - p1.z;
end;

class operator tVector.Add( p:tPoint; v:tVector ): tPoint;
begin
    result.x := p.x + v.x;
    result.y := p.y + v.y;
    result.z := p.z + v.z;
end;

function Test( p0,p1: tPoint ):double;
var
    v: tVector;
begin
    v := p1 - p0;
end;

PM MAIL   Вверх
cat512
Дата 21.7.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

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



А чем вас такой код не устраивает ?
Код

function Test( p0,p1: tPoint ):double;
var
    P: PVector;
begin
    P := p1 - p0;
//  P^.X
end;



Добавлено через 41 секунду
Можно ещё использовать шаблоны

Добавлено через 2 минуты и 57 секунд
Только не забудьте исправить код и в перегруженных операциях, он у вас неправильный!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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