gpt4 book ai didi

c - 调用正确的函数时发生段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:29 24 4
gpt4 key购买 nike

我正在解决 0-1 背包问题。我用蛮力算法解决了这个问题。

在 main.cpp 中

  int main(int argc, char *argv[])
{
......
int solution;
solution = bruteForce();
......
}

奇怪的是,当我在 main.cpp 中实现 bruteForce() 时,我的程序运行正常,然而,在我将 bruteForce() 移动到 bruteForce.cpp 并将其包含在 main.cpp 中后,程序将产生调用 bruteForce() 时出现段错误。

以下是我将 bruteForce() 移动到 bruteForce.cpp 的方法。首先我创建了一个头文件functions.h(因为我想在暴力破解成功后通过其他方法解决问题)

  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 中,我声明了一些全局变量:

  #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

最佳答案

您不应该将变量放在头文件中。当您从两个源文件中包含它时,两者都将获得该变量的各自副本 - 因此您将无法按照您认为的方式在函数之间传输数据(或者至少,这是我对它应该如何理解工作 - 我承认我不是 100% 确定实际发生了什么)。

将数据传输到函数的最佳方法是使用参数。根据需要调用该函数,并通过函数返回值或通过指针或引用参数返回数据。像这样使用全局变量很容易出错(如您所见),而且其他查看您代码的人也不太清楚。

如果您绝对想使用全局变量,请在一个您的文件中声明它们,并使用extern<将它们放入您的全局头文件中/em> 前面的语句。当您随后包含来自另一个文件的 header 时,extern 会告诉编译器它不应该实际创建变量本身,而是由另一个目标文件提供。

因此,在 main.cpp 中:

int n, S;
vector<int> value, size, x;

在 global.h 中:

extern int n, S;
extern vector<int> value, size, x;

关于c - 调用正确的函数时发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com