gpt4 book ai didi

c++ - 我的程序在 Windows 上使用 MSVC 和 g++ 编译器运行,但在 Linux 上不运行

转载 作者:可可西里 更新时间:2023-11-01 11:20:30 28 4
gpt4 key购买 nike

我正在为一项研究任务编写遗传算法。我不是一个非常有经验的 C++ 程序员(因为我是一名数学家),但我管理我的程序在 Windows 环境中使用 MSVC 2008 和 g++ 编译器正确编译和运行(我使用 CygWin 在 Windows 7 上运行 g++)。现在,问题是这个程序必须在 Linux 环境下使用 g++ 的集群计算机中运行,但它总是在执行时崩溃(尽管至少它编译正确)。我已经解决了明显的细节(例如使用/而不是\作为文件名),但无法使其在 Linux 上正常运行。

但是,当我在下面注释函数“Cruce”时,程序结束了,尽管它显然没有执行所需的任务。这是这样一个函数的代码,以及它调用的其他函数(唯一的全局变量是 BITGEN,它是一个值为 30 的整数,用于 float 的格雷码转换):

    void xPC_BLX(double d, const vector<double>& P1, const vector<double>& P2,
vector<double>& Hijo1, vector<double>& Hijo2, int genes){

double I, A1, C1;
int i;

for (i=0; i < genes; i++)
{

I= d * fabs(P1[i]-P2[i]);

A1=P1[i]-I; if (A1<0) A1=0.0;
C1=P1[i]+I; if (C1>1) C1=1.0;
Hijo1[i]= A1 + Rand()*(C1-A1);

A1=P2[i]-I; if (A1<0) A1=0.0;
C1=P2[i]+I; if (C1>1) C1=1.0;
Hijo2[i]= A1 + Rand()*(C1-A1);
}
}

/**********************************************************/
/* Itoc and Ctoi translate ints to strings and vice versa */
/**********************************************************/
unsigned long int Ctoi(char *Cad_ent, int length){

int i;
unsigned long n;

n = (unsigned long) 0;
for (i=0; i<length; i++)
{
n <<= 1;
n += (*Cad_ent++ - (int) '0');
}
return(n);
}

void Itoc(unsigned long int n, char *Cad_sal, int length){

int i;

for (i=length-1; i>=0; i--)
{
Cad_sal[i] = (char)('0' + (n & 1));
n >>= 1;
}
}


/*****************************************************************/
/* Translations between fixed point ints and reflected Gray code */
/*****************************************************************/

void Gray(char *Cad_ent, char *Cad_sal, int length){

int i;
char last;

last = '0';
for (i=0; i<length; i++)
{
Cad_sal[i] = (char)('0' + (Cad_ent[i] != last));
last = Cad_ent[i];
}
}

/*************************************************************************/
/* Translations between string representation and floating point vectors */
/*************************************************************************/
void StringRep(const vector<double> vect, char *Cad_sal, int genes){

int i;
unsigned long int n;
int pos;
double INCREMENTO;
static char *tmpstring;
static int flag = 1;

if (flag) {
tmpstring = (char*) calloc (genes*BITGEN,sizeof(char));
flag = 0;
}

pos = 0;
for (i=0; i < genes; i++)
{

INCREMENTO=(1-0)/(pow(2.0, (double) BITGEN) - 1.0);

n = (int) ((vect[i] - 0) / INCREMENTO + 0.5);

Itoc(n, tmpstring, BITGEN);
Gray(tmpstring, &Cad_sal[pos], BITGEN);

pos += BITGEN;
}
Cad_sal[pos] = '\0';

}

/*****************************************/
int DistHam(char *Cr_1, char *Cr_2, int genes){

int i, dist;
dist=0;

for (i=0; i<genes*BITGEN; i++) if (Cr_1[i]!=Cr_2[i]) dist++;

return dist ;
}

/**********************/
/* CROSS OPERATOR */
/**********************/

void Cruce(int& fin, int genes, vector<vector<double> >& POPULATION,
vector<vector<double> >& CONTROL, double GA_THR)
{

int i, j, temp, mom, dad;
static char *String1, *String2;
static int flag=1;
vector<double> newind(genes+1,0), newcont(2,0);


if (flag) {
String1 = (char*) calloc (genes*BITGEN,sizeof(char));
String2 = (char*) calloc (genes*BITGEN,sizeof(char));
flag = 0;
}

vector<int> sample(TAMPOP,0);
for (i=0; i < TAMPOP; i++) sample[i] = i;

for (i=0; i < TAMPOP; i++)
{
j = Randint(i,TAMPOP-1);
temp = sample[j];
sample[j] = sample[i];
sample[i] = temp;
}

for (i=0; i < TAMPOP; i++) CONTROL[i][0]=0;

fin=TAMPOP;

for (i=0; i < TAMPOP/2; i++)
{
mom=sample[2*i];
dad=sample[2*i+1];


StringRep(POPULATION[mom], String1, genes);
StringRep(POPULATION[dad], String2, genes);


if (DistHam(String1, String2, genes)/2.0 > GA_THR)
{

POPULATION.push_back(newind);

POPULATION.push_back(newind);

CONTROL.push_back(newcont);

CONTROL.push_back(newcont);

xPC_BLX(1,POPULATION[mom],POPULATION[dad],POPULATION[fin],
POPULATION[fin+1], genes);

CONTROL[fin][0]=1;
CONTROL[fin+1][0]=1;
fin=fin+2;

}
}
}

为了找出可能的错误,我已经尽力了几天,但没有成功。我猜该错误必须与内存问题有关(因为我总是收到段错误错误),但我不知道它在哪里。我不知道 Windows 和 Linux 处理内存的方式之间应该存在重大差异。你们中有人可以帮助我吗?

提前致谢!

最佳答案

一些可能对您有帮助的一般提示:

  • -Wall -Wextra 编译g++ 的选项并改进您的源代码,直到所有警告都消失

  • 也尝试使用 clang++ 进行编译编译器也有 -Wall (或类似)选项

  • -g 编译选项(除了 -Wall )以获取调试信息

  • 使用 gdb调试您的程序(并在调试器下运行程序,然后使用 bt 进行回溯等...)

  • 使用 valgrind查找内存泄漏

  • 避免使用 callocmalloc ,最好使用标准 C++ 容器(如 std::stringstd::vector<>std::map<> 等)。

此外,在您自己的笔记本电脑或台式机上安装 Linux 发行版,并通过命令行学习使用 Linux。

关于c++ - 我的程序在 Windows 上使用 MSVC 和 g++ 编译器运行,但在 Linux 上不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984117/

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