2010-06-02 3 views
2

Я создал функцию, подобную ниже в коде Delphi. но это не сработает. Каков правильный способ его преобразования?Функция От C до Delphi

char* ReadSpeechFile(char* pFileName, int *nFileSize) 
{ 
    char *szBuf, *pLinearPCM; 
    int nSize; 
    FILE* fp; 

    //read wave data 
    fp = fopen(pFileName, "rb"); 
    if(fp == NULL) 
     return NULL; 
    fseek(fp, 0, SEEK_END); 
    nSize = ftell(fp); 

    //linear 
    szBuf = (char *)calloc(nSize, sizeof(char)); 
    fseek(fp, 0, SEEK_SET); 
    fread(szBuf, sizeof(char), nSize, fp); 
    fclose(fp); 

    *nFileSize = nSize; 

    return szBuf; 
} 
+0

Почему это помечено как C#? –

ответ

5

Я переведу это на следующий код Delphi (не тестировался):

function ReadSpeechFile(pFileName: PAnsiChar, var nFileSize: Integer): PAnsiChar; 
var 
szBuf: PAnsiChar; 
nSize: Integer; 
fp: TFileStream; 
begin 
    fp := TFilestream.Create(pFileName, fmOpenRead); 
    try 
    nSize := fp.Size; 
    GetMem(szBuf, nSize); 
    fp.Read(szBuf^, nSize); 
    finally 
    fp.Free; 
    end; 
    nFileSize := nSize; 
    Result := szBuf; 
end; 
+0

Правильное преобразование в код Delphi возвращает строку, а не 'PAnsiChar'. Результат можно по-прежнему применять для «PAnsiChar», но нет опасности утечки памяти. – mghie

+0

@ mghie: Я согласен, но что «правильно», вероятно, зависит от контекста. Например, вам может потребоваться передать указатель на другой API и, следовательно, сохранить оригинальную подпись. –

+0

@mghie: Ну ... Может быть много вариантов конвертировать это в Delphi. Как использование TFileStream или TEXT, используйте AnsiString или PAnsiChar и т. Д. Я просто дал самый близкий (из моего POV) перевод. –

1

Как об этом

function ReadSpeechFile(const AFileName: string): TMemoryStream; 
begin 
    Result := TMemoryStream.Create; 
    try 
    Result.LoadFromFile(AFileName); 
    except 
    FreeAndNil(Result); 
    raise; 
    end; 
end; 

Это более "delphish", делает то же самое, пропускает строку проблемы с кодированием. Вы можете использовать его следующим образом:

Speech := ReadSpeechFile('C:\somefile.dat'); 
MySize := Speech.Size; 
... 
+0

, но как назначить буфер PAnsiChar? – XBasic3000

+0

Не лучше ли использовать, наконец, вместо исключения и повторного рейза? Делает ту же работу и выглядит красивее для меня. – Kcats

+0

@ XBasic3000: Обычно использовать char * в C как произвольный буфер. То, что я написал, больше с точки зрения Delphi. Также SetString (S, Buffer, Len) будет копировать буфер в S, а затем вы можете передать функции PAnsiChar (S) в функции. – dmajkic