2010-06-02 6 views
2

J'ai créé une fonction similaire ci-dessous dans le code delphi. mais ça ne marchera pas. Quelle est la bonne façon de convertir cela?Fonction De 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

pourquoi est-ce marqué comme C#? –

Répondre

5

je traduirai ce au code Delphi suivant (non testé):

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

Une conversion correcte en code Delphi retournerait une chaîne, pas un 'PAnsiChar'. Le résultat peut toujours être transtypé en 'PAnsiChar', mais il n'y a aucun risque de perte de mémoire. – mghie

+0

@mghie: Je suis d'accord mais ce qui est "correct" dépend probablement du contexte. Par exemple, vous devrez peut-être passer le pointeur de fonction à une autre API et conserver ainsi la signature d'origine. –

+0

@mghie: Eh bien ... Il peut y avoir beaucoup d'options pour convertir cela en Delphi. Comme une utilisation TFileStream ou TEXT, utilisez AnsiString ou PAnsiChar, etc. Je viens de donner une traduction la plus proche (de mon POV). –

1

Que diriez-vous de cette

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

Il est plus "delphish", fait la même chose, saute chaîne problèmes d'encodage. Vous pouvez l'utiliser comme ceci:

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

mais comment affecter le tampon au PAnsiChar? – XBasic3000

+0

N'est-il pas préférable d'utiliser enfin, au lieu d'exception et re-augmenter? Fait le même travail et me semble plus joli. – Kcats

+0

@ XBasic3000: Il est courant d'utiliser char * dans C comme tampon arbitraire. La chose que j'ai écrite est plus du point de vue de Delphi. Egalement, SetString (S, Buffer, Len) va copier le tampon vers S, et ensuite vous pouvez passer PAnsiChar (S) aux fonctions. – dmajkic