Pascal对象:如何进行类型化的前向声明?

时间:2011-05-16 13:56:25

标签: delphi object pascal

我正在将伟大的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;

2 个答案:

答案 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;