我的程序在Windows上使用MSVC和G 编译器运行,但在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查找内存泄漏

  • 避免使用callocmalloc,更好地使用标准C 容器(例如std::stringstd::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;时,您是否不在数组之外。

问候。

最新更新