2015-02-10 11 views
5

Bir hdf5 dosyasını golang içine okumak için go-hdf5 kullanıyorum. Windows 7'de mingw ve hdf5 1.8.14_x86'nın yeni bir kopyasını kullanıyorum ve önceden tanımlanmış tiplerin hiçbirini kullanmaya çalışmak gibi görünmüyor, örneğin T_NATIVE_UINT64'e odaklanalım.Neden Golang'dan doğru bir C sabitini okuyamıyorum?

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() 
} 

Açıkçası HDF5 ve başlıkları/DLL en derleyici işaret etmek gerekir: Ben temelde go-HDF5 bırakır sorunu ve puan üzerinden oldukça temel bir şeye yanlış gittiğini aşağıda, konuyu azalttık ve, getireyim çalışan sonra H5T_NATIVE_UINT64 değeri için farklı cevaplar vermek, benim pc sabit okunur nerede nasıl/yukarıda varyasyonlarını Running

the value of the constant is -1962924545 

üzerinde baskılar bu olacaktır yürütülmesi. Ancak, hiçbiri doğru değer olmadığından ve döndürülen kimliğe sahip olmayan bir türün kullanılmaya çalışılmasının şaşırtıcı olmadığından eminim. Yazıyorum ve "gerçek" bir C programını çalıştırırsanız

, ben farklı sonuçlar

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 

ve çalışan kullanarak derleniyor

#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()); 
} 

olsun bana

the value of the constant is 50331683 

verir Ve anlaşılıyor Doğrudan benim go programımdan kullanabileceğim doğru değer olmak. Açıkçası, sabitleri kullanabilmek istiyorum. Bunun neden olabileceği hakkında bir fikrin var mı? Aşağıda

Ekstra bilgi aşağıdaki yorumlar:

ben hdf5 başlıklarında H5T_NATIVE_UINT64 tanımında aradık ve bütün başlık burada

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

aşağıdaki

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; 

bkz Teşekkürler!

+0

H5T_NATIVE_UINT64 sabitinin nasıl tanımlandığını gösterir misiniz? – fuz

+0

başlıklarının aracılığıyla bakınca, bu 'c olsun: \ HDF_Group \ HDF5 \ 1.8.14_x86 \ şunlardır> 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

Yorumunuz okumak zordur. Bu bilgiyi sorunuza ekleyebilir misiniz? Altında bir "düzenle" düğmesi var. Lütfen tüm tür ve ilgili makro tanımları dahil olmak üzere mümkün olduğunca çok bilgi ekleyin. – fuz

cevap

0

H5T_NATIVE_UINT64, bir sabit değil, en sonunda, c0nun anlamadığı (H5Open(), H5T_NATIVE_UINT64_g) değerini değerlendiren bir #define değildir.

gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64 

Sonuç: Şimdi

#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 

H5OPEN için aynı:

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

verir:

Bu gcc en ön işlemcisinde hata ayıklama çıkışı açarak kontrol etmek kolaydır

#define H5OPEN H5open(), 

Şu anda, cgo, #define VALUE 1234 gibi basit tamsayı sabit tanımlarını veya gcc önişlemcisinin bir tamsayı sabitine dönüşeceği herhangi bir şeyi anlamıyor. $GOROOT/src/cmd/cgo/gcc.go'da func (p *Package) guessKinds(f *File) işlevine bakın.

+0

Peki neden Linux üzerinde çalışıyor gibi görünüyor? Yoksa öyle değil mi? Golang'dan hdf5 kullanmak demek mahkum mu? – kch

+0

cgo, * herhangi bir * platformda sabit olmayan #defines'i değerlendiremez. Go'dan hdf5 kullanmak mahkum edilmez, sadece komik #defines içermeyen uygun bir Go stili API'sini sağlayan bir Go sarmalayıcısı bulmanız/yazmanız yeterlidir. Ayrıca [Swig] (http://www.swig.org/) denemelisiniz. BTW, bahsettiğiniz tanım, bir değişken tarafından izlenen bir func çağrısı oluşturur ... Sanırım değişken değeri, #define'in temsil etmesi gereken sözde ifadenin değeri olarak kullanılır. Bu ne tür bir API? Hdf5 lib'lerini derlediğinizde oluşturulan uyarı miktarına baktınız mı? Yapıştırma çubuğuyla dokunmayacağım. – wldsvc

+0

Tamam Giriş için teşekkürler! Peki bu paket go/hdf5 için sadece bir tanesi. Sanırım daha iyi bir yol bulabilmem için eski eski csv dosyaları ile uğraşacağım. – kch

İlgili konular