Трабла с указателями

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Трабла с указателями

Сообщение kostia » 16.10.2008 13:24:36

Даже не знаю как описать. Имеется запись и указатель на нее, в самой записи имеются указатели на другие записи, что-то типа это:

Код: Выделить всё
  PD3DXMeshContainerDerived = ^TD3DXMeshContainerDerived;
  TD3DXMeshContainerDerived = packed record { public D3DXMESHCONTAINER }
    Name:               PAnsiChar;
    MeshData:           TD3DXMeshData;

    pMaterials:         PD3DXMaterialArray;
    pEffects:           PD3DXEffectInstance;
    NumMaterials:       DWORD;
    pAdjacency:         PDWORD;

    pSkinInfo:          ID3DXSkinInfo;

    pNextMeshContainer: PD3DXMeshContainer;

    end;
...
var
  pMeshContainer: PD3DXMeshContainerDerived;
begin
  if (pMeshContainer.pSkinInfo = nil) then Exit; //здесь выдает ошибку "illegal qualifier"(незаконный классификатор)
  if (pMeshContainer.pMaterials[iMaterial].pTextureFilename <> nil) then ... //тоже самое
end;


На Delphi работает без проблем, а FreePascal 2.2.0 ругается. Если требуется могу выложить весь код.
kostia
незнакомец
 
Сообщения: 3
Зарегистрирован: 14.10.2008 12:38:21

Re: Трабла с указателями

Сообщение alexs » 16.10.2008 13:47:33

Ну и что ты хочеш? судя по коду - ты объявил переменную - указатель на структуру.
kostia писал(а):var
pMeshContainer: PD3DXMeshContainerDerived;

А кто этот указатель будет инициализировать? ты ж первым действием своего кода пытаешься куда-то чегото записать. А вот куда - не понятно.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Трабла с указателями

Сообщение Михаил Крамер » 16.10.2008 14:11:09

Delphi не ругается? Быть не может, ведь чтобы вытащить значение из записи, на которую указывает pMeshContainer, нужно писать pMeshContainer^.pSkinInfo, а не просто pMeshContainer.pSkinInfo.
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

Re: Трабла с указателями

Сообщение Bupyc » 16.10.2008 14:25:02

Михаил Крамер писал(а):Delphi не ругается? Быть не может, ведь чтобы вытащить значение из записи, на которую указывает pMeshContainer, нужно писать pMeshContainer^.pSkinInfo, а не просто pMeshContainer.pSkinInfo.


Есть у дельфи такая особенность. Дельфёвый компилятор сам за программиста подобные вещи додумывает. Т.е. вместо pMeshContainer^.pSkinInfo можно написать pMeshContainer.pSkinInfo. Хотя на мой взгляд это глупость. Раз уж это указатель то и обращение к структуре по указателю должно производиться соответствующим образом.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Трабла с указателями

Сообщение kostia » 16.10.2008 14:28:00

Мдээ...
D3DXTypes.pas(114,12) Hint: may be pointer dereference is missing

Стоило лишь глаза ниже опустить.
---
Вообще код не мой. Его профи писал, а раз профи писал, то и не заморачиваюсь, а тут на самом деле столько глюков.
Теперь понимаю, почему у большинства людей складывается негативное отношение к Delphi/Pascal. А все из-за всяких быдло-кодеров, которые называют себя профи.(hook через таймер :))
kostia
незнакомец
 
Сообщения: 3
Зарегистрирован: 14.10.2008 12:38:21

Re: Трабла с указателями

Сообщение dildargee1 » 14.01.2015 15:57:15

А уж не замахнулись ли ваши преподаватели на Великую Теорему :shock: ?
dildargee1
незнакомец
 
Сообщения: 1
Зарегистрирован: 14.01.2015 15:49:22

Re: Трабла с указателями

Сообщение dedm0zaj » 14.01.2015 16:12:33

kostia писал(а):а тут на самом деле столько глюков


это не глюки, а особенности диалектов.

в делфе допускается (и вроде это не грех) не разыменовывать указатели.

в ObjFPC такое не прокатит. мне лично больше нравится, как в ObjFPC, ибо указатель это указатель и доступ к значению должен быть через разыменовывание.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Трабла с указателями

Сообщение Дож » 14.01.2015 16:18:03

dedm0zaj писал(а):в ObjFPC такое не прокатит. мне лично больше нравится, как в ObjFPC, ибо указатель это указатель и доступ к значению должен быть через разыменовывание.

Прокатит, если включить AUTODEREF
Код: Выделить всё
[doj@larion ~/temp]$ cat ptrexample.pas
{$MODE OBJFPC}
{$MODESWITCH AUTODEREF}
type
PRecord = ^TRecord;
TRecord = record
  I: Integer;
  S: AnsiString;
end;

var
  R: TRecord;
  P: PRecord;

begin
  P := @R;
  P.I := 105;
  P.S := 'a string';
  Writeln(P.I, ' ', P.S);
end.
[doj@larion ~/temp]$ fpc ptrexample.pas && ./ptrexample
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
105 a string
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Трабла с указателями

Сообщение svk12 » 14.01.2015 18:22:16

А New() не надо выполнить?
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Трабла с указателями

Сообщение Дож » 14.01.2015 18:56:55

svk12 писал(а):А New() не надо выполнить?

Нет, потому что указателю присвоена ссылка на глобальную переменную.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru