我的目的是将用C语言编写的LKH TSP算法包含在我的C ++项目中。
LKH:http://www.akira.ruc.dk/~keld/research/LKH/
资料来源:http://www.akira.ruc.dk/~keld/research/LKH/LKH-2.0.7.tgz
首先,我开始编写一个CMakeLists.txt来创建一个不包含LKHmain.c的库。
file(GLOB_RECURSE SOURCES SRC/*.c)
file(GLOB_RECURSE HEADERS SRC/INCLUDE/*.h)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/SRC/INCLUDE)
set(LIB_SOURCES ${SOURCES})
list(REMOVE_ITEM LIB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/SRC/LKHmain.c)
add_library(lkh
${LIB_SOURCES}
)
target_link_libraries(lkh m)
之后我想实现两个使用该库的函数。 第一个只是读取TSPLib的文件并将值复制到我自己的Map结构中。 第二个应该通过使用我的地图结构解决TSP问题而不读取任何文件。 (该程序通常只能通过读取文件来使用,因此这是一个包装器部分)
现在我的问题: 所有变量都在LKH.h中定义,并由所有实现使用。所以例如
LKH.h
int TraceLevel; /* Specifies the level of detail of the output
given during the solution process.
The value 0 signifies a minimum amount of
output. The higher the value is the more
information is given */
Node *FirstNode; /* First node in the list of nodes */
int InitialTourAlgorithm;
现在它们用在* .c类中。
GreedyTour.c
#include "LKH.h"
GainType GreedyTour()
{
Node *From, *To, *First, *Last = 0, **Perm;
int Count, i;
double EntryTime = GetTime();
if (TraceLevel >= 1) {
if (InitialTourAlgorithm == BORUVKA)
printff("Boruvka = ");
else if (InitialTourAlgorithm == GREEDY)
printff("Greedy = ");
else if (InitialTourAlgorithm == NEAREST_NEIGHBOR)
printff("Nearest-Neighbor = ");
else if (InitialTourAlgorithm == QUICK_BORUVKA)
printff("Quick-Boruvka = ");
}
Cost = 0;
EdgesInFragments = 0;
From = FirstNode;
do {
From->Degree = 0;
From->Tail = From;
From->Mark = 0;
From->Next = From->Suc;
From->Pred = From->Suc = 0;
}
while ((From = From->Next) != FirstNode);
..........
..........
在此示例中,变量TraceLevel,InitialTourAlgorithm和FirstNode用作全局变量。
我的问题:当我把LKH.h包括在课堂上时,我有很多副作用。执行方法后,全局变量已更改。 我想重置所有这些以执行下一个方法,而不需要任何先前设置的值。 我写了几个测试用例,gtest方法有奇怪的效果,在我看来是由全局变量行为引起的。
这是我的包装文件:
lkh.h
#include "model/map.h"
namespace ttp {
class LKHWrapper {
public:
MapPtr createMap(std::string);
int *calc(MapPtr map);
};
}
lkh.cpp
#include <fstream>
#include <limits>
#include "lkh.h"
extern "C"
{
#include "LKH.h"
#include "Genetic.h"
#include "Heap.h"
}
namespace ttp {
MapPtr LKHWrapper::createMap(std::string pathToFile) {
...
[change global variables]
...
return map;
}
int* LKHWrapper::calc(MapPtr map) {
...
[change global variables]
...
return BestTour
}
解决该问题的最简单方法是什么,并且可以免费实现这两种方法?
@Mason Watmough:
是的,但问题是我不是自己定义它们。我必须使用
extern "C"
{
#include "LKH.h"
#include "Genetic.h"
#include "Heap.h"
}
定义并声明变量(参见C程序中的LKH.h)
并且没有冲突或链接错误! 变量仅在lkh.cpp中存在一次,包括LKH.h. 库liblkh.a也没有这个变量,因为它们只在LKH.h中定义。
答案 0 :(得分:0)
如果您的全局变量在头文件和c程序中定义,则需要选择其中一个。从c程序中删除全局变量定义并将其全部放在头文件中,或者弄清楚如何将头文件正确地放入所有不同的c程序中。标题和程序之间的冲突变量可能是导致这种情况的原因。