Pascal Object: как сделать типизированное предварительное объявление? - PullRequest
2 голосов
/ 16 мая 2011

Я перевожу отличный заголовок 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 ]

8 голосов
/ 16 мая 2011

Запись не нужно передавать по значению.Фактически, оригинальный 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;

Да, вам разрешено объявить указатель на что-то, прежде чем вы объявите то, на что оно указывает.Тем не менее, вы не имеете права пересылать и объявлять записи, поэтому приведенный выше порядок является единственным возможным порядком для этих трех объявлений.

4 голосов
/ 16 мая 2011

Pascal имеет автоматическое объявление типа forward для классов указателей, что, как я полагаю, на самом деле выполняет функция.Так что простое изменение ваших объявлений на что-то вроде этого (предупреждение, я не использовал паскаль более 12 лет) должно работать:

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;
...