我在解决一个0-1的napsack问题。
我用蛮力算法解决了这个问题。
在main.cpp中
int main(int argc, char *argv[])
{
......
int solution;
solution = bruteForce();
......
}
奇怪的是,当我在main.cpp中实现bruteForce()时,我的程序工作正常,但是,当我将bruteForce()移动到bruteForce.cpp并将其包含在main.cpp中之后,程序在调用bruteForce()时会产生分段错误。
下面是我如何将bruteForce()移动到bruteForce.cpp。
首先我创建了一个header functions.h(因为我想在成功实现brute force之后用其他方法解决这个问题)
functions.h:
#include "global.h"
int bruteForce();
int multiplication( int );
然后我将bruteForce()移到bruteForce.cpp
#include <iostream>
#include <stdlib.h>
#include <vector>
#include "global.h"
#include "functions.h"
using namespace std;
int bruteForce()
{
int bestValue = 0;
int j, tempSize, tempValue;
int bestChoice[n+1];
for(int i=0; i<multiplication(n); i++)
{
tempSize = 0;
tempValue =0;
j = n;
while(x[j]!=0 && j>0)
{
x[j] = 0;
j--;
}
x[j] = 1;
for(int k=1; k<=n; k++)
{
if(x[k] == 1)
{
tempSize += size[k];
tempValue += value[k];
}
}
if((tempValue > bestValue) && (tempSize <= S))
{
bestValue = tempValue;
for(int p=1; p<=n; p++)
bestChoice[p] = x[p];
}
}
for(int p=1; p<=n; p++)
x[p] = bestChoice[p];
return bestValue;
}
在global.h中,我声明了一些glabal变量:
#include <vector>
using std::vector;
static int n, S;
static vector<int> value, size, x;
gdb调试器显示
Program received signal SIGSEGV, Segmentation fault.
0x08049308 in main()
知道为什么会这样吗?
提前谢谢。
顺便说一下,如果你需要更多的信息,这里是package。
您可以首先在此包的根目录中键入make然后键入执行。
./bin/01knapsack -BF inputs/n5S11.in n5s11.out
最佳答案
不应该将变量放在头文件中当你从你的两个源文件中都包含这个变量时,两个都会得到他们自己的变量副本,因此你就不能以你认为的方式在函数之间传输数据(或者至少,这是我对它应该如何工作的理解——我承认我不能百分之百确定实际发生了什么)。
将数据传输到函数的最佳方法是使用参数使用函数所需的任何内容调用函数,并通过函数返回值或指针或引用参数返回数据使用全局变量来处理类似的事情很容易出错(如您所见),而对于其他查看您的代码的人来说就不那么清楚了。
如果您绝对想使用全局变量,请在一个源文件中声明它们,并将它们放在全局头文件中,前面有一个extern语句然后,当包含另一个文件的头时,extern告诉编译器它不应该实际创建变量本身,而是由另一个对象文件提供。
因此,在main.cpp中:
int n, S;
vector<int> value, size, x;
在全球范围内。h:
extern int n, S;
extern vector<int> value, size, x;