Страница 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 14:57:15
dildargee1
А уж не замахнулись ли ваши преподаватели на Великую Теорему

?
Re: Трабла с указателями
Добавлено: 14.01.2015 15:12:33
dedm0zaj
kostia писал(а):а тут на самом деле столько глюков
это не глюки, а особенности диалектов.
в делфе допускается (и вроде это не грех) не разыменовывать указатели.
в ObjFPC такое не прокатит. мне лично больше нравится, как в ObjFPC, ибо указатель это указатель и доступ к значению должен быть через разыменовывание.
Re: Трабла с указателями
Добавлено: 14.01.2015 15: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 17:22:16
svk12
А New() не надо выполнить?
Re: Трабла с указателями
Добавлено: 14.01.2015 17:56:55
Дож
svk12 писал(а):А New() не надо выполнить?
Нет, потому что указателю присвоена ссылка на глобальную переменную.