【问题标题】:My program stop itself in a part of code. How to fix it?我的程序在部分代码中自行停止。如何解决?
【发布时间】:2020-04-09 10:33:42
【问题描述】:

我正在做一个程序来验证树中的循环。小数据没问题,但是当数据增加时,它会停止。请帮帮我。

Cromosoma *kruskalModificado(Gen *setGenes, int numGenes, int numVertices, Cromosoma *cromosoma){
int **matrizAux=NULL;
matrizAux=inicializarMatriz(matrizAux,numVertices);
int *posicionesFinales=(int *) calloc(numVertices,sizeof(*posicionesFinales));
int *vecGenes=(int*) calloc(numVertices,sizeof(*vecGenes));
int listo;
int indiceRandom,elegidos=0;
while(elegidos<numVertices-1){//Itero hasta que todos los vertices hayan sido agregados al arbol
    indiceRandom=rand()%numGenes;//Indice aleatorio de mi conjunto de genes
    if(vecGenes[indiceRandom]==1)
        continue;
    vecGenes[indiceRandom]=1;
    Gen genAux=setGenes[indiceRandom];//Obtengo el gen
    //Verifico que vertice aun no ha sido agregado y lo agrego a mi conjunto de componentes.
    listo=1;
    int *visitados=(int *) calloc(numVertices,sizeof(*visitados));
    valido(matrizAux,numVertices,genAux.v1,genAux.v2,&listo,visitados);
    free(visitados);
    printf("Aqui\n");
    if(listo==0)
        continue;
    (*cromosoma).genes[(*cromosoma).numGenes]=genAux;
    (*cromosoma).numGenes++;
    (*cromosoma).fitnessValue+=genAux.peso;
    elegidos++;
    matrizAux[genAux.v1][posicionesFinales[genAux.v1]]=genAux.v2;
    matrizAux[genAux.v2][posicionesFinales[genAux.v2]]=genAux.v1;
    posicionesFinales[genAux.v1]++;
    posicionesFinales[genAux.v2]++;
}
free(posicionesFinales);
free(vecGenes);
for(int i=0 ; i < numVertices; i ++)
    free(matrizAux[i]);
return (Cromosoma *)cromosoma;

}

这里是另一部分代码。

void valido(int **matriz, int numVertices, int genInicial, int genFinal,int *listo, int *visitados){
if(genInicial==genFinal){
    (*listo)=0;
    return ;
}
int j=0;
visitados[genInicial]=1;
while(matriz[genInicial][j]!=-1 && j<numVertices &&(*listo)==1){
    if(visitados[matriz[genInicial][j]]==0){
        valido(matriz,numVertices,matriz[genInicial][j],genFinal,listo,visitados);
    }

    j++;
}
return ;
}

Valido 函数帮助我检测给定边缘中的循环。

【问题讨论】:

  • 错误是什么?
  • 当我运行程序时,它工作正常,在其他情况下,它的停止本身说我“进程返回 -1073741819 (0xC0000005)”
  • 0xc0000005 表示程序访问了无效内存。要解决此问题,第一步是找到问题发生的位置。在调试器中运行程序。它会立即告诉您哪一行触发了崩溃,并允许单步执行代码并检查状态。
  • 点评int *vecGenes=(int*) calloc(numVertices,sizeof(*vecGenes)); ... indiceRandom=rand()%numGenes; if(vecGenes[indiceRandom]==1) ...
  • 非常感谢。我解决了我的问题。 int vecGenes=(int) calloc(numVertices,sizeof(*vecGenes)); .. 不是 numVertices,而是 numGenes。

标签: c cycle-detection


【解决方案1】:

在 int vecGenes=(int) calloc(numVertices,sizeof(*vecGenes)); .. 不是 numVertices,而是 numGenes。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2013-03-20
    • 1970-01-01
    • 2013-03-13
    • 2012-01-25
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多