我正在尝试编写一个应该在C ++程序中使用C库(LIS库)的程序。结构对象的创建/初始化似乎存在问题。
当我在维基百科页面上运行示例程序时:http://en.wikipedia.org/wiki/Lis_%28linear_algebra_library%29它像魅力一样运行,但当然是编译为C程序。
在我的C ++代码中,我按如下方式执行:
#include "stdafx.h"
#include <iostream>
extern "C"
{
#include "lis.h"
#include "lis_config.h"
LIS_MATRIX A;
}
using namespace std;
int main(LIS_INT argc, char* argv[])
{
lis_initialize(&argc, &argv);
lis_matrix_create(LIS_COMM_WORLD, &A);
getchar();
return 0;
}
当我运行此代码时,它在lis_matrix_create行给出了访问冲突。好像A有一个内存地址,它的数据成员(LIS_MATRIX被定义为Lis.h中的结构)尚未初始化,因此它们的地址为NULL。
请您告诉我如何创建LIS_MATRIX,以便我可以像维基百科页面上的示例代码一样使用它?
提前谢谢!
回复亚当和罗斯里奇: 我在Windows 7 64位上使用visual studio 2013。 Lis库的手册指出它与Visual Studio 2008,2010和2012编译器以及gcc 3.4和4.4以及一些IBM,Intel和PGI C ++编译器兼容,我希望Visual Studio 2013不会成为问题。
此外,在此代码中,如果我取出&#39; extern C&#39;阻止,并包括&#39; stdio.h&#39;而不是iostream,它运行没有问题(所以我猜这意味着使用C编译器?)。我还包括iostream,访问违规开始。
答案 0 :(得分:1)
你包括
lis_config.h
后
lis.h
本身就是一个错误(你必须先包含它)。此外,如果您触及lis_config中的任何内容,则必须重建整个库(使用项目的大多数相同编译器标志,例如“-msee2”,如果您使用SSE2)。在重建之前只需交换标头,看看是否足够..
更多的话:一个库可以轻松地检测错误顺序中包含的标题,为lis开发人员制作一张票。