我正在将伟大的fmod C标题翻译成Pascal,而且因为前向声明而被卡住了。 如果我在类型之前声明函数,则错误为“FMOD_CODEC_STATE:unknown”,如果我在函数之前声明FMOD_CODEC_STATE ,则错误为“FMOD_CODEC_METADATACALLBACK:unknown” 知道如何解决这个问题吗? 非常感谢你!
type
FMOD_CODEC_STATE = Record
numsubsounds: Integer;
waveformat: array[0..0] of FMOD_CODEC_WAVEFORMAT;
plugindata: Pointer;
filehandle: Pointer;
filesize: Cardinal;
fileread: FMOD_FILE_READCALLBACK;
fileseek: FMOD_FILE_SEEKCALLBACK;
metadata: FMOD_CODEC_METADATACALLBACK;
end;
FMOD_CODEC_METADATACALLBACK = function (codec_state: FMOD_CODEC_STATE; tagtype: FMOD_TAGTYPE; name: PChar; data: Pointer; datalen: Cardinal; datatype: FMOD_TAGDATATYPE; unique: Integer):FMOD_RESULT;
答案 0 :(得分:8)
记录不需要按值传递。实际上,原始C代码无论如何都不会通过值传递它。它通过引用传递,带有指针。声明指针,然后是函数,然后是记录:
type
PFMOD_CODEC_STATE = ^FMOD_CODEC_STATE;
FMOD_CODEC_METADATACALLBACK = function (codec_state: PFMOD_CODEC_STATE; tagtype: FMOD_TAGTYPE; name: PChar; data: Pointer; datalen: Cardinal; datatype: FMOD_TAGDATATYPE; unique: Integer):FMOD_RESULT;
FMOD_CODEC_STATE = Record
numsubsounds: Integer;
waveformat: PFMOD_CODEC_WAVEFORMAT;
plugindata: Pointer;
filehandle: Pointer;
filesize: Cardinal;
fileread: FMOD_FILE_READCALLBACK;
fileseek: FMOD_FILE_SEEKCALLBACK;
metadata: FMOD_CODEC_METADATACALLBACK;
end;
是的,你可以在宣布它所指向的东西之前声明指向某个东西的指针。但是,您不能转发声明记录,因此上面给出的顺序是这三个声明的唯一可能顺序。
答案 1 :(得分:4)
Pascal具有指针类的自动转发类型声明,这是我假设该函数实际需要的。因此,只需将您的声明更改为类似的内容(警告,我在12年内没有使用过pascal)应该可以正常工作:
type
PFMOD_CODEC_STATE=^FMOD_CODEC_STATE;
FMOD_CODEC_METADATACALLBACK = function (codec_state: PFMOD_CODEC_STATE; tagtype: FMOD_TAGTYPE; name: PChar; data: Pointer; datalen: Cardinal; datatype: FMOD_TAGDATATYPE; unique: Integer):FMOD_RESULT;
FMOD_CODEC_STATE = Record
numsubsounds: Integer;
waveformat: array[0..0] of FMOD_CODEC_WAVEFORMAT;
plugindata: Pointer;
filehandle: Pointer;
filesize: Cardinal;
fileread: FMOD_FILE_READCALLBACK;
fileseek: FMOD_FILE_SEEKCALLBACK;
metadata: FMOD_CODEC_METADATACALLBACK;
end;