Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能正确地读取Golang的C常数吗?_C_Go_Mingw_Hdf5 - Fatal编程技术网

为什么可以';我不能正确地读取Golang的C常数吗?

为什么可以';我不能正确地读取Golang的C常数吗?,c,go,mingw,hdf5,C,Go,Mingw,Hdf5,我正在使用go-hdf5将hdf5文件读入golang。我在windows7上使用的是mingw和hdf5 1.8.14_x86的最新版本,似乎尝试使用任何预定义类型都不起作用,让我们关注一下t_NATIVE_UINT64。我将问题归结为以下几点,这基本上使go-hdf5不存在问题,并指出了一些根本性的问题: package main /* #cgo CFLAGS: -IC:/HDF_Group/HDF5/1.8.14_x86/include #cgo LDFLAGS: -LC:/HDF_

我正在使用go-hdf5将hdf5文件读入golang。我在windows7上使用的是mingw和hdf5 1.8.14_x86的最新版本,似乎尝试使用任何预定义类型都不起作用,让我们关注一下t_NATIVE_UINT64。我将问题归结为以下几点,这基本上使go-hdf5不存在问题,并指出了一些根本性的问题:

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()
}
在读取常数的方式/位置上运行上述变量,将对H5T_NATIVE_UINT64的值给出不同的答案。然而,我很确定没有一个是正确的值,事实上,尝试使用返回id的类型是行不通的,这并不奇怪

如果我编写并运行一个“真正的”C程序,我会得到不同的结果

#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());
}
跑步给了我力量

the value of the constant is 50331683
这似乎是正确的值,因为我可以直接从我的围棋程序中使用它。显然,我希望能够使用常量。知道为什么会这样吗

额外信息如下:

我在hdf5头文件中查找了H5T_NATIVE_UINT64的定义,并查看了以下内容

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;
整个标题在这里


谢谢

H5T_NATIVE_UINT64不是一个常数,而是一个最终计算为
(H5Open(),H5T_NATIVE_UINT64_g)
的定义,cgo不理解

通过在gcc的预处理器上打开调试输出,很容易进行检查:

gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64
结果:

#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g)
现在,H5OPEN也一样:

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

#define H5OPEN H5open(),

现在,cgo确实理解简单的整数常量定义,比如
#define VALUE 1234
,或者gcc预处理器将转换为整数常量的任何内容。请参见
$GOROOT/src/cmd/cgo/gcc.go
中的函数
func(p*Package)和(f*File)

你能告诉我常数H5T_NATIVE_UINT64是如何定义的吗?通过查看标题,我得到了
c:\HDF_Group\HDF5\1.8.14_x86\include>grep H5T_NATIVE_UINT64*H5Tpkg.h:H5_DLLVAR size\u H5T_NATIVE_UINT64\u ALIGN;H5Tpublic.h:#定义H5T_NATIVE_UINT64(H5OPEN H5T_NATIVE_UINT64_g)H5Tpublic.h:H5 DLLVAR hid_t H5T_NATIVE_UINT64_g您的评论很难阅读。你介意在你的问题中添加这些信息吗?下面有一个“编辑”按钮。请添加尽可能多的信息,包括所有类型和相关的宏定义。当然,很抱歉,仅供参考,我在Linux上测试了这个,但问题没有发生。打印
50331683
。在处理无符号整数时,还要确保使用
%u
而不是
%d
。最好能看看生成的代码。使用
go build-work
获取位置。那么为什么它似乎在Linux上工作呢?还是不是?这是否意味着使用golang的hdf5注定失败?cgo无法在任何平台上评估非常量定义。使用Go的hdf5并不是注定要失败的,您只需要找到/编写一个Go包装器,它提供了一个正确的Go风格API,并且没有有趣的#定义。你也可以试一试。顺便说一句,您提到的define生成一个func调用,后跟一个变量。。。我猜变量值被用作#define应该表示的伪表达式的值。那是什么样的API?您是否查看了编译hdf5 LIB时生成的警告数量?我不会用棍子戳它。好的,谢谢你的输入!这个软件包是go/hdf5唯一的一个。我想我会坚持使用好的旧csv文件,直到找到更好的方法。
gcc -E -dM test_go.c | grep '#define H5OPEN'
#define H5OPEN H5open(),