2010-06-02 36 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#? – 2010-06-02 05:26:59

回答

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 2010-06-02 06:38:35

+0

@mghie:我同意,但是「正確」可能取決於上下文。例如,您可能需要將函數指針傳遞給另一個API,因此保留原始簽名。 – 2010-06-02 06:49:40

+0

@mghie:恩......可能有很多選項可以將它轉換爲Delphi。就像使用TFileStream或TEXT一樣,使用AnsiString或PAnsiChar等。我只是給出了一個離我的POV最近的翻譯。 – 2010-06-02 07:04:41

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 2010-06-02 09:09:37

+0

最後使用是不是更好,而不是除了重新加註?做同樣的工作,看起來更漂亮。 – Kcats 2010-06-03 07:53:03

+0

@ XBasic3000:在C中使用char *作爲任意緩衝區是很常見的。我寫的東西更多來自德爾福的觀點。 SetString(S,Buffer,Len)將緩衝區複製到S,然後您可以將PAnsiChar(S)傳遞給函數。 – dmajkic 2010-06-04 20:50:47