2012-10-17 20 views
8

È possibile generare automaticamente unità di interfaccia dai file di intestazione C? In particolare, voglio racchiudere la libreria HDF5, e sarebbe bello se potessi evitare di scrivere manualmente l'interfaccia.Crea automaticamente unità di interfaccia Delphi/Freepascal dal file di intestazione C

+0

Che assomiglia a una molto grande e complessa biblioteca. Confiderò con fiducia che non esiste uno strumento che faccia una traduzione buona e completa. –

+1

Esiste una traduzione parziale a Delphi della versione 4 della libreria hdf [qui] (http://dspatial.sourceforge.net/). Lo troverai nella cartella 'Drivers'. Potrebbe servire come primo passo della traduzione. –

+0

Il problema è che HDF4 e HDF5 non condividono nulla tranne * HDF * nel loro nome ... –

risposta

11

Il pascal gratuito include lo strumento H2PAS.

h2pas tenta di convertire un file di intestazione C ad un'unità di pascal. può gestire la maggior parte dei costrutti C che si trovano in un file di intestazione C, e tenta di tradurli nelle loro controparti pascal.

+0

È molto meglio degli altri strumenti che ho usato, ma in pratica è necessario continuare a eseguire molte elaborazioni manuali a mano. –

+0

Questa sembra la strada da percorrere. Vedrò fino a che punto mi riesce effettivamente ... –

5

Bob Swart() ha un programma di utilità che permette di convertire un sacco di file di intestazione (anche se di solito c'è un po 'di lavoro manuale coinvolti pure) chiamato HeaderConvert. Non l'ho mai confrontato con lo strumento @RRUZ links, ma è un'altra opzione.

Project JEDI ne ha uno; Non l'ho mai provato Lo puoi trovare here.

+0

Quello Jedi è praticamente lo stesso di Headconv. –

5

In generale completamente automatizzato traduzione di C intestazioni a qualcos'altro (che non è un sovrainsieme efficace della funzionalità C necessario) è difficile se non impossibile.

Questo perché a causa di macro non si può vedere come tradurli. Le macro spesso ottengono il loro significato solo dal contesto. Esempio

#define uglymacro 1,2,3,4 

ma anche (e questo è più comune):

SCARYAPIMACRO void func(int c); 

SCARYAPIMACRO è quindi spesso una macro che verifica OS definisce per selezionare la convenzione di chiamata giusta per il giusto OS/architettura.

Tuttavia, ciò non significa che gli strumenti non siano reali. Ma il risultato è più semiautomatico, ho la migliore e migliore esperienza con h2pas.

Ho tradotto molte intestazioni di Windows (incluso commctrl di FPC che ha una macro sendmessage ogni poche righe).

Quello che faccio di solito è creare un piccolo programma pascal che analizza il codice sorgente e usa l'euristica per dividerlo in parti che sono per lo più omogenee (tutte le strutture o costanti, macro, dichiarazioni di procedure, ecc.). Poi guardo la fonte e spesso faccio alcuni sostituti globali.

Solo dopo averlo eseguito attraverso il traduttore, il processo è spesso iterativo (affinare la separazione, fare sostituzioni globali, provare a tradurre, se fallisce, riprovare ecc.).

Il processo purtroppo richiede una buona conoscenza di C, roba pragma inclusa.