我的程序在Windows上使用MSVC和G 编译器运行,但在Linux上不运行
My program runs with MSVC and g++ compilers on Windows but not on Linux
我正在为研究任务编程遗传算法。我不是一个经验丰富的C 程序员(因为我是数学家),但是我管理了程序,可以在Windows环境上正确使用MSVC 2008和G 编译器正确运行(我使用Cygwin在Windows 7上运行G )。现在,问题在于,该程序必须在Linux环境上使用G 的群集计算机中运行,但是它总是在执行时间崩溃(尽管至少它正确编译了)。我已经解决了明显的详细信息(如使用/而不是用于文件名称),但无法使其在Linux上正确运行。
但是,当我在下面评论函数时,该程序会结束,尽管显然没有执行所需的任务。这是此类函数的代码,以及它所调用的其他函数(唯一的全局变量是BITGEN,它是一个整数,值30用于浮动点号的灰色代码翻译):
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] = ' ';
}
/*****************************************/
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++
并改进您的源代码,直到所有警告消失 -
也尝试使用
-Wall
(或类似)选项的Clang 编译器编译 -
使用
-g
选项编译(另外还有-Wall
)以获取调试信息 -
使用GDB调试您的程序(并在调试器下运行程序,然后使用
bt
进行回溯等...) -
使用Valgrind查找内存泄漏
-
避免使用
calloc
和malloc
,更好地使用标准C 容器(例如std::string
,std::vector<>
,std::map<>
等)。
另外,在您自己的笔记本电脑或台式机上安装Linux发行版,然后通过命令行学习Linux。
我在提出的代码中看到一个潜在的错误。
static char *tmpstring;
static int flag = 1;
if (flag) {
tmpstring = (char*) calloc (genes*BITGEN,sizeof(char));
flag = 0;
}
如果函数StringRep()
多次称为genes
参数:缓冲区不会增长,因此,将会发生什么情况,因此,某人将在分配的第一个缓冲区之外写入。注意,同样适用于函数Cruce()
。
然后,我认为fin=TAMPOP;
有第二个错误。没有什么是TAMOP
的解释。但是,在执行POPULATION[fin+1]
,CONTROL[fin+1][0]=1;
或fin=fin+2;
时,您是否不在数组之外。
问候。
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 如何使用传递给编译器的相同参数在 cmake 中运行命令?
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 需要有关运行具有输入类型的编译器的帮助
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- C++程序编译器在使用g++命令编译后自动运行exe文件
- 是否允许编译器在运行时调用立即(consteval)函数
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 无法构建 quazip。MOC 编译器不会运行。命令行未找到相关类
- 无法在终端中的 Windows 5.10.1 上运行 qt10.1 的编译器'cl'
- 运行时附加编译器标志
- 编译器发射std :: move()运行时调用
- C 编译器输出由于Permisson误差而未运行
- Inno设置编译器未运行我的C/C 代码
- 如何从我的qt应用程序运行gcc编译器?
- ISO C++禁止可变长度数组 'arrayz' [-Wvla],已经在 c++ 在线 gdb 编译器上尝试过,运行良好
- 在不同的编译器中运行c++代码会产生不同的结果吗
- 获取运行时使用的编译器
- Arduino Uno代码可以使用交叉编译器在BeagleBone Black上运行吗
- 当我做出语句 root->right->right = newnode(7);注释,编译器显示运行时错误。谁能解释为什么?