2015-02-10 6 views
5

Sto usando go-hdf5 per leggere un file hdf5 in golang. Sono su windows7 usando una copia piuttosto recente di mingw e hdf5 1.8.14_x86 e sembra che provare a utilizzare uno qualsiasi dei tipi predefiniti non funzioni, concentriamoci ad esempio su T_NATIVE_UINT64. Ho ridotto il problema a quanto segue, che lascia sostanzialmente go-HDF5 fuori del problema e punti a qualcosa di fondamentale che non va:Perché non riesco a leggere correttamente una costante C da Golang?

package main 

/* 
#cgo CFLAGS: -IC:/HDF_Group/HDF5/1.8.14_x86/include 
#cgo LDFLAGS: -LC:/HDF_Group/HDF5/1.8.14_x86/bin -lhdf5 -lhdf5_hl 
#include "hdf5.h" 

#include <stdio.h> 

void print_the_value2() { printf("the value of the constant is %d\n", H5T_NATIVE_UINT64); } 
*/ 
import "C" 

func main() { 
    C.print_the_value2() 
} 

È, ovviamente, bisogno di avere HDF5 e puntare il compilatore alle intestazioni/DLL e l'esecuzione di andare a prendere, quindi l'esecuzione di stampe questo sul mio pc

the value of the constant is -1962924545 

variazioni di cui sopra, nel modo in cui/in cui si legge la costante correre, darà risposte diverse per il valore di H5T_NATIVE_UINT64. Tuttavia sono abbastanza sicuro che nessuno è il giusto valore e infatti provare a usare un tipo con ID restituito non funziona, non sorprende.

Se scrivo ed eseguire un programma C "reale", ottengo risultati diversi

#include <stdio.h> 
#include "hdf5.h" 

hid_t _go_hdf5_H5T_NATIVE_UINT64() { return H5T_NATIVE_UINT64; } 

int main() 
{ 
    printf("the value of the constant is %d", _go_hdf5_H5T_NATIVE_UINT64()); 
} 

compilazione utilizzando

C:\Temp>gcc -IC:/HDF_Group/HDF5/1.8.14_x86/include -LC:/HDF_Group/HDF5/1.8.14_x86/bin -lhdf5 -lhdf5_hl -o stuff.exe stuff.c 

e in esecuzione mi dà

the value of the constant is 50331683 

E che appare per essere il giusto valore in quanto posso usarlo direttamente dal mio programma di go. Ovviamente voglio essere in grado di usare le costanti, invece. Qualche idea sul perché questo potrebbe accadere?

Ulteriori informazioni seguenti commenti qui sotto:

ho guardato per la definizione di H5T_NATIVE_UINT64 nelle intestazioni HDF5 e vedere il seguente

c:\HDF_Group\HDF5\1.8.14_x86\include>grep H5T_NATIVE_UINT64 * 
H5Tpkg.h:H5_DLLVAR size_t H5T_NATIVE_UINT64_ALIGN_g; 
H5Tpublic.h:#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 
H5Tpublic.h:H5_DLLVAR hid_t H5T_NATIVE_UINT64_g; 

L'intera intestazione è qui

http://www.hdfgroup.org/ftp/HDF5/prev-releases/hdf5-1.8.14/src/unpacked/src/H5Tpublic.h

Grazie!

+0

Puoi mostrarmi come è definita la costante H5T_NATIVE_UINT64? – fuz

+0

Guardando attraverso le intestazioni, ottengo questo 'C: \ HDF_Group \ HDF5 \ 1.8.14_x86 \ include> grep H5T_NATIVE_UINT64 * H5Tpkg.h: H5_DLLVAR size_t H5T_NATIVE_UINT64_ALIGN_g; H5Tpublic.h: #define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) H5Tpublic.h: H5_DLLVAR hid_t H5T_NATIVE_UINT64_g; ' – kch

+0

Il tuo commento è difficile da leggere. Ti dispiacerebbe aggiungere queste informazioni alla tua domanda? C'è un pulsante "modifica" sotto di esso. Si prega di aggiungere quante più informazioni possibili, inclusi tutti i tipi e le definizioni delle macro rilevanti. – fuz

risposta

0

H5T_NATIVE_UINT64 NON è una costante ma una #define che alla fine valuta a (H5Open(), H5T_NATIVE_UINT64_g), che cgo non capisce.

E 'facile controllare accendendo output di debug su preprocessore di GCC:

gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64 

Risultato:

#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 

Ora lo stesso per H5OPEN:

gcc -E -dM test_go.c | grep '#define H5OPEN' 

dà:

#define H5OPEN H5open(), 

In questo momento, cgo capisce la costante intera semplice come #define VALUE 1234 o qualsiasi cosa che il preprocessore gcc trasformerà in una costante intera. Vedere la funzione func (p *Package) guessKinds(f *File) in $GOROOT/src/cmd/cgo/gcc.go.

+0

Quindi, perché sembra funzionare su Linux? O no? Significa che usare hdf5 da golang è condannato? – kch

+0

cgo non può valutare #define non costanti su * qualsiasi * piattaforma. L'utilizzo di hdf5 da Go non è destinato, devi solo trovare/scrivere un wrapper Go che fornisca un'API Go style corretta senza #defini divertenti. Puoi anche provare [Swig] (http://www.swig.org/). A proposito, la definizione menzionata genera una chiamata func seguita da una variabile ... Immagino che il valore della variabile sia usato come valore della pseudo-espressione che il #define dovrebbe rappresentare. Che tipo di API è quella? Hai esaminato la quantità di avvisi generati quando hai compilato le librerie hdf5? Non lo toccherei con un bastoncino. – wldsvc

+0

OK grazie per l'input! Bene, quel pacchetto è l'unico disponibile per go/hdf5. Credo che rimarrò con buoni vecchi file CSV fino a quando non riesco a capire un modo migliore. – kch

Problemi correlati