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

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

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

Ответить
kostia
незнакомец
Сообщения: 3
Зарегистрирован: 14.10.2008 12:38:21

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

Сообщение kostia »

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

Код: Выделить всё

  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 ругается. Если требуется могу выложить весь код.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

А кто этот указатель будет инициализировать? ты ж первым действием своего кода пытаешься куда-то чегото записать. А вот куда - не понятно.
Михаил Крамер
новенький
Сообщения: 73
Зарегистрирован: 08.02.2008 13:26:40

Сообщение Михаил Крамер »

Delphi не ругается? Быть не может, ведь чтобы вытащить значение из записи, на которую указывает pMeshContainer, нужно писать pMeshContainer^.pSkinInfo, а не просто pMeshContainer.pSkinInfo.
Bupyc
постоялец
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Сообщение Bupyc »

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


Есть у дельфи такая особенность. Дельфёвый компилятор сам за программиста подобные вещи додумывает. Т.е. вместо pMeshContainer^.pSkinInfo можно написать pMeshContainer.pSkinInfo. Хотя на мой взгляд это глупость. Раз уж это указатель то и обращение к структуре по указателю должно производиться соответствующим образом.
kostia
незнакомец
Сообщения: 3
Зарегистрирован: 14.10.2008 12:38:21

Сообщение kostia »

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

Стоило лишь глаза ниже опустить.
---
Вообще код не мой. Его профи писал, а раз профи писал, то и не заморачиваюсь, а тут на самом деле столько глюков.
Теперь понимаю, почему у большинства людей складывается негативное отношение к Delphi/Pascal. А все из-за всяких быдло-кодеров, которые называют себя профи.(hook через таймер :))
dildargee1
незнакомец
Сообщения: 1
Зарегистрирован: 14.01.2015 14:49:22

Сообщение dildargee1 »

А уж не замахнулись ли ваши преподаватели на Великую Теорему :shock: ?
dedm0zaj
постоялец
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Сообщение dedm0zaj »

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


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

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

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

Сообщение Дож »

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
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

А New() не надо выполнить?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

Нет, потому что указателю присвоена ссылка на глобальную переменную.
Ответить