Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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
使用不同数据结构的C库 我有一个问题,关于如何在C++中尽可能灵活地编写计算代码的问题,我给你这个例子:_C++_C_Interface - Fatal编程技术网

使用不同数据结构的C库 我有一个问题,关于如何在C++中尽可能灵活地编写计算代码的问题,我给你这个例子:

使用不同数据结构的C库 我有一个问题,关于如何在C++中尽可能灵活地编写计算代码的问题,我给你这个例子:,c++,c,interface,C++,C,Interface,我正在编写一个代码来处理网格(有限元计算),基本上是一组节点和连接。目前我们只关注节点结构: struct Node { double x,y,z; }; 我有一套使用这个节点数据结构实现的算法 然而,我想使用一个外部库,该库提供对网格的特定几何处理(由collegue编写),它具有不同的节点数据结构 struct LibNode { double x; int idx; double y,z;}; 注意:int idx在库中使用,我自己的开发中不需要它 该库的所有算法都是用这种结构编写的。

我正在编写一个代码来处理网格(有限元计算),基本上是一组节点和连接。目前我们只关注节点结构:

struct Node { double x,y,z; };
我有一套使用这个节点数据结构实现的算法

然而,我想使用一个外部库,该库提供对网格的特定几何处理(由collegue编写),它具有不同的节点数据结构

struct LibNode { double x; int idx; double y,z;};
注意:int idx在库中使用,我自己的开发中不需要它

该库的所有算法都是用这种结构编写的。 我只是在使用库,对我来说,它只是一套处理方法,我可以应用到我用于计算的网格上

我想使用C语言编写的库中的算法,下面是我设想的解决方案:

  • 将我的节点复制到某个LibNode,这是最简单的解决方案,但效率很低

  • 用LibNode重写我的代码,但是如果我想使用几个lib呢

  • 重写库

我这里有几个问题:

  • 我是否错过了更好的解决方案?我觉得无论我做什么,都无法避免使用库的数据结构

  • 由于性能是一个问题,目前我认为重写lib将是最好的解决方案。然后我将用C++编写它,我不想犯与原来的LIB相同的错误。 我看到了两个选项,lib的模板实现,更“优雅”,但也更难由一个研究F77的物理学家团队编写和维护。 或者通过抽象类操纵网格,并将数据结构定义委托给库的用户但通过虚拟方法(通过代码运行超过一百万次)访问数据对我来说似乎效率非常低,对吗


提前感谢您的回复

如果您的代码符合C,最简单的方法是使用
节点
重建库,只需将节点更改为
结构节点{double x;int idx;double y,z;}。对成员
x
y
z
的所有访问都应正常工作,
idx
节点将或多或少地作为填充处理。毕竟,这是使用结构来维护应用程序的最佳点之一:您可以添加成员,而无需对现有代码进行任何更改或很少更改

当然,如果您假定在某个地方
&node.y==&node.x+1
一切都会中断

我能想到的唯一一件可能有问题的事情是加载结构,这些结构本可以作为一个整体保存到一个二进制文件中。应该重写该部分(以及保存部分),以明确地保存和恢复成员,而不是整个结构-无论如何,保存整个结构是不可移植的,如果可能,应该避免


另一个问题,主要是当它被用作DLL时,是一个重大的变化,因为它会破坏兼容性,所以你应该考虑使用你的库重建所有程序。

你使用的库是“操纵网格,基本上是一组节点和连接”吗?那你为什么要编写自己的库来复制你使用的库呢?或者在较低级别库的顶部添加另一层?您正在扩展您使用的库吗?也许您自己的结构应该是不透明的结构(类似于标准的C
文件
结构)?或者您的结构应该以某种方式合并库结构?你能详细说明你的图书馆与你使用的图书馆的职责吗?我已经更新了这篇文章。我不是在扩展库或构建顶层,它只是一组对我有用的处理方法。我确实想用它,而不是更多。我理解您对不透明结构的建议,但是库也应该使用它,对吗?也许您应该将库结构合并到您自己的结构中,比如
struct MyNode{struct LibNode LibNode;/*库专用的其他数据*/}?如果您这样做,您基本上是在C中模拟继承,并且可以将指向您的结构的指针传递给希望指向
LibNode
的指针的函数。这当然是我的选择之一!但这带来了两个问题:我必须调整代码以使用库,那么如果我使用两个呢?那么,我的结构应该包含相同数据的多个“副本”。idx需要设置还是设置为固定值,或者它只是程序使用的工作存储?好吧,我觉得在我自己的代码中从库引入数据结构是不可能的,至少在大多数情况下是这样的。