2015-02-10 17 views
5

Tôi đang sử dụng go-hdf5 để đọc tệp hdf5 vào golang. Tôi đang sử dụng windows7 bằng cách sử dụng một bản sao khá gần đây của mingw và hdf5 1.8.14_x86 và có vẻ như cố gắng sử dụng bất kỳ loại được xác định trước nào không hoạt động, hãy tập trung ví dụ vào T_NATIVE_UINT64. Tôi đã làm giảm vấn đề này như sau, mà về cơ bản lá go-hdf5 ra của vấn đề và điểm tại một cái gì đó khá cơ bản đi sai:Tại sao tôi không thể đọc một hằng số C từ Golang một cách chính xác?

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

Bạn rõ ràng là cần phải có hdf5 và chỉ trình biên dịch vào các tiêu đề/dlls và chạy đi lấy, sau đó thực hiện bản in này trên pc của tôi

the value of the constant is -1962924545 

chạy biến những điều trên, trong cách/nơi hằng số được đọc, sẽ cho câu trả lời khác nhau cho giá trị của H5T_NATIVE_UINT64. Tuy nhiên tôi khá chắc chắn đó là không có giá trị đúng và trong thực tế, cố gắng sử dụng một loại với id trả lại không hoạt động, không ngạc nhiên.

Nếu tôi viết và chạy một "thực" chương trình C, tôi nhận được kết quả khác nhau

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

Biên soạn bằng

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 

và chạy mang lại cho tôi

the value of the constant is 50331683 

Và đó xuất hiện là giá trị phù hợp vì tôi có thể sử dụng nó trực tiếp từ chương trình của tôi. Rõ ràng là tôi muốn có thể sử dụng các hằng số thay thế. Bất kỳ ý tưởng tại sao điều này có thể xảy ra?

thêm thông tin sau đây ý kiến ​​dưới đây:

Tôi đã tìm kiếm định nghĩa của H5T_NATIVE_UINT64 trong tiêu đề hdf5 và xem sau

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; 

Toàn bộ tiêu đề là đây

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

Cảm ơn!

+0

Bạn có thể chỉ cho tôi cách hằng số H5T_NATIVE_UINT64 được xác định? – fuz

+0

Xem qua các tiêu đề, tôi nhận được thông tin này '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

Cảm nhận của bạn là khó đọc. Bạn có nhớ thêm thông tin này vào câu hỏi của mình không? Có một nút "chỉnh sửa" bên dưới nó. Vui lòng thêm càng nhiều thông tin càng tốt, bao gồm tất cả các loại và định nghĩa macro có liên quan. – fuz

Trả lời

0

H5T_NATIVE_UINT64 KHÔNG phải là hằng số nhưng #define cuối cùng đánh giá thành (H5Open(), H5T_NATIVE_UINT64_g), điều mà bản ngã không hiểu.

Thật dễ dàng để kiểm tra bằng cách bật kết xuất debug trên Preprocessor gcc của:

gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64 

Kết quả:

#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 

Bây giờ giống nhau cho H5OPEN:

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

cung cấp cho:

#define H5OPEN H5open(), 

Ngay bây giờ, cgo không hiểu hằng số nguyên đơn giản xác định như #define VALUE 1234 hoặc bất kỳ thứ gì mà bộ xử lý trước gcc sẽ biến thành hằng số nguyên. Xem hàm func (p *Package) guessKinds(f *File) trong $GOROOT/src/cmd/cgo/gcc.go.

+0

Vậy tại sao nó hoạt động trên Linux? Hay không? Điều này có nghĩa là sử dụng hdf5 từ golang có phải chịu số phận không? – kch

+0

cgo không thể đánh giá #defines không đổi trên * bất kỳ nền tảng nào *. Sử dụng hdf5 từ Go không phải là doomed, bạn chỉ cần tìm/viết một wrapper Go mà không cung cấp một API phong cách Go đúng với không có #defines funny. Bạn cũng có thể dùng thử [Swig] (http://www.swig.org/). BTW, định nghĩa bạn đề cập tạo ra một cuộc gọi func theo sau bởi một biến ... Tôi đoán giá trị biến được sử dụng như là giá trị của biểu thức giả mà #define được cho là đại diện. API đó là gì? Bạn đã xem xét số lượng cảnh báo được tạo ra khi bạn biên soạn libs hdf5 chưa? Tôi sẽ không chạm vào nó bằng một cây gậy. – wldsvc

+0

OK cảm ơn cho đầu vào! Vâng gói đó là người duy nhất ra có cho đi/hdf5. Tôi đoán tôi sẽ gắn bó với các tệp csv cũ tốt cho đến khi tôi có thể tìm ra cách tốt hơn. – kch

Các vấn đề liên quan