Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2010, 16:02   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Непонятный код.

Работаю с физическим движком, там есть типы соединений:

Код:
  PcpConstraint = ^cpConstraint;
  cpConstraint = record
(различные данные...)
...
...
  end;

  PcpPinJoint = ^cpPinJoint;
  cpPinJoint = record
   constraint    : cpConstraint;
(различные данные...)
...
...
  end;
То есть PcpPinJoint содержит в себе тип cpConstraint и имея указатель на PcpPinJoint мы можем через него получить данные в constraint. Но если же мы имеем constraint то мы не можем получить данные в PcpPinJoin. Но в чужой демке в коде есть строчка, которую я не понимаю никак:
Код:
pinjoint:=pointer(constraint);
В ней по constraint мы как то получаем указатель на pinjoint. КАК? Pointer ведь тип, а тут он выступает в качестве функции. Или вот еше код из движка:
Код:
	result:=PcpConstraint(cpBreakableJointInit(cpBreakableJointAlloc, delegate, space, AfreeDelegate));
только тут уже не pointer a PcpConstraint (тоже тип) работает как функция . Наверно я что-то не знаю в delphi, разъясните пожалуйста!
Вадим Буренков вне форума Ответить с цитированием
Старый 18.08.2010, 16:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Pointer ведь тип, а тут он выступает в качестве функции.
Ненене.
Это называется приведение типов. Пишется <имя типа>(Переменная) - значение этой переменной преобразовывается в тип <имя типа>
В случае с pinjoint:=pointer(constraint);
Имеется ввиду что constraint содержит значение, которое должно быть распознано как указатель.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2010, 16:23   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Имеется ввиду что constraint содержит значение, которое должно быть распознано как указатель.
Все равно не понимаю. Вот данные которые содержит constraint:
Код:
  cpConstraint = record
    klass         : PcpConstraintClass;
    a             : PcpBody; // bodies attached to constraint
    b             : PcpBody;
    maxForce      : cpFloat; // max force before constraint breaks =0 never
    biasCoef      : cpFloat;
    maxBias       : cpFloat;
    space         : pcpSpace;
  end;
Каким образом приводя PcpConstraint к pointer мы получаем PcpPinJoint? Ведь PcpConstraint никак не связан с PcpPinJoint (только PcpPinJoint содержит cpConstraint).
Вадим Буренков вне форума Ответить с цитированием
Старый 18.08.2010, 16:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вот данные которые содержит constraint:
Хы... Веселый кодик )))
Ты точно ничего не попутал? Может там есть другая переменка с таким же названием?

Впрочим если не ошибаюсь это хитропопый вариант получения значения klass
Эквивалентен constraint.klass, хотя и глупо выглядит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2010, 16:36   #5
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Хы... Веселый кодик )))
Ты точно ничего не попутал? Может там есть другая переменка с таким же названием?
Мне кажется нет, но все может быть. Там модуль (движка) на 5000 строк и около 10 комментов))). Причем там все настолько сложно и накручено, что возникает мысль что писал его явно психопат. Сейчас попробую сделать небольшой примерчик и посмотрю как это приведение типов будет работать.
Вот если интересно посмотреть модуль:
Вложения
Тип файла: rar zglChipmunk.rar (27.9 Кб, 11 просмотров)

Последний раз редактировалось Вадим Буренков; 18.08.2010 в 16:38.
Вадим Буренков вне форума Ответить с цитированием
Старый 18.08.2010, 16:42   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

так будет понятнее?
Код:
 pinjoint:=constraint as pointer; //pinjoint:=pointer(constraint);  

result:=PcpConstraint(cpBreakableJointInit(cpBreakableJointAlloc, delegate, space, AfreeDelegate));

result:=cpBreakableJointInit(cpBreakableJointAlloc, delegate, space, AfreeDelegate)
 as PcpConstraint;
только приведение типа Pointer(...) в отличии от as не делает никаких проверок соответсвия типов
это только указание транслятору считать что значение имеет такой тип и все.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.08.2010, 16:43   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

да... Писал явный любитель указателей. Чувствуется Сишная школа...
Цитата:
так будет понятнее?
Зачем это нужно было делать?
посмотри модуль - там constraint - параметр-переменная указателя, зачем ее было нужно жестко к указателю приводить коль она указатель итак?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2010, 17:04   #8
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

На небольшом примере тоже работает:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

type
  PcpConstraint = ^cpConstraint;
  cpConstraint = record

  end;

  PcpPinJoint = ^cpPinJoint;
  cpPinJoint = record
   constraint    : cpConstraint;
   data:integer
  end;

  var
  pin:PcpPinJoint;
  con:PcpConstraint;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
new(pin);
pin.data:=5;
con:=@pin.constraint;
pin:=nil;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//есть указатель только на PcpConstraint, по нему находим PcpPinJoint
pin:=pointer(con);
form1.Caption:=inttostr(pin.data);
end;

end.
При нажатии на кнопку 1 создается переменная pin, в ней con. Далее оставляем только указатель на con (pin:=nil). Не понятно почему с помощю pin:=pointer(con); по указателю con мы получаем указатель на pin?
Вадим Буренков вне форума Ответить с цитированием
Старый 18.08.2010, 17:09   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

new(pin); - Зарезервировали память
pin.data:=5; - Внесли в ячейку значение
con:=@pin.constraint; - Присвоили указатель еще одной переменке на ту же ячейку
pin:=nil; - Переменную отцепили от ячейки памяти
Значение в памяти сохранилось!
pin:=pointer(con); - Записали в переменную ранее сохраненный адрес на ячейку
form1.Caption:=inttostr(pin.data); И конечно же все работает

Ты же сохранил @pin.constraint; в переменку con. С этого момента у тебя на эту ячейку памяти где лежит 5 два якоря - pin и con. Обниление одного из них не приведет к потере ссылок на ячейку, вторая же все еще содержит этот адрес
А потом ты обнилинной переменке pin присваиваешь то что содержится в con (а их содержимое - адрес одинаков был до pin:=NIL)
Потому pin восстанавливается за счет con

Кстати. Перепиши
Код:
  cpPinJoint = record
   data:integer;
   constraint    : cpConstraint;
  end;
Удивишся ))))))
I'm learning to live...

Последний раз редактировалось Stilet; 18.08.2010 в 17:13.
Stilet вне форума Ответить с цитированием
Старый 18.08.2010, 17:15   #10
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Ты же сохранил @pin.constraint; в переменку con. С этого момента у тебя на эту ячейку памяти где лежит 5 два якоря - pin и con.
а их содержимое - адрес одинаков был до pin:=NIL
Ведь pin ссылался на данные PcpPinJoint а con на данные PcpConstraint. Или обе переменные ссылаются на данные PcpPinJoint только в con информация что надо указывать на данные PcpConstraint?
Сейчас посмотрел и правда pin и con выдают один и тот же адрес. А я то думал указатели по другому работают . Stilet, спасибо!
Цитата:
Кстати. Перепиши
Вот теперь я точно ничего не понимаю). В чем дело?

Последний раз редактировалось Вадим Буренков; 18.08.2010 в 17:23.
Вадим Буренков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
непонятный скрипт osven JavaScript, Ajax 0 07.02.2010 06:13
непонятный баг brain-bras Общие вопросы C/C++ 4 14.10.2009 21:26
Непонятный синтаксис. jojahti Общие вопросы C/C++ 10 14.10.2009 19:05
непонятный компилятор Waleriy Общие вопросы по Java, Java SE, Kotlin 2 11.12.2008 14:16
непонятный код Kostua Помощь студентам 5 27.04.2008 18:17