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!
Puoi mostrarmi come è definita la costante H5T_NATIVE_UINT64? – fuz
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
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