Страница 1 из 1

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

СообщениеДобавлено: 16.10.2008 13:24:36
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 ругается. Если требуется могу выложить весь код.

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

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

А кто этот указатель будет инициализировать? ты ж первым действием своего кода пытаешься куда-то чегото записать. А вот куда - не понятно.

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

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

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

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


Есть у дельфи такая особенность. Дельфёвый компилятор сам за программиста подобные вещи додумывает. Т.е. вместо pMeshContainer^.pSkinInfo можно написать pMeshContainer.pSkinInfo. Хотя на мой взгляд это глупость. Раз уж это указатель то и обращение к структуре по указателю должно производиться соответствующим образом.

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

СообщениеДобавлено: 16.10.2008 14:28:00
kostia
Мдээ...
D3DXTypes.pas(114,12) Hint: may be pointer dereference is missing

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

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

СообщениеДобавлено: 14.01.2015 15:57:15
dildargee1
А уж не замахнулись ли ваши преподаватели на Великую Теорему :shock: ?

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

СообщениеДобавлено: 14.01.2015 16:12:33
dedm0zaj
kostia писал(а):а тут на самом деле столько глюков


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

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

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

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

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

СообщениеДобавлено: 14.01.2015 18:22:16
svk12
А New() не надо выполнить?

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

СообщениеДобавлено: 14.01.2015 18:56:55
Дож
svk12 писал(а):А New() не надо выполнить?

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