0

我有双重功能

double Grid::getAverageNeighborhoodFitnessEvaluation(int agentPositionX, int agentPositionY)
{
  GetNeighbourhood(agentPositionX, agentPositionY,neighborhoodEvaluations);
  int neighborscount = 0;
  double fitnesssum = 0;
  double neighborfitness;
  double value;
  for (size_t i = 0; i < neighborhoodEvaluations.size(); ++i)
  {
    if ((*(neighborhoodEvaluations.at(i))) != NULL)
    {
      neighborfitness = (*(neighborhoodEvaluations.at(i)))->GetFitness();
      if(neighborfitness<0)
          neighborfitness=0;
      fitnesssum+=neighborfitness;
      neighborscount++;
    }
  }
  value = fitnesssum/neighborscount;
  return value;
}

GetNeighbourhood 将一个定义类型(Agent)的数组分配给neighborhoodEvaluations

*(neighborhoodEvaluations.at(i)))->GetFitness();返回表示数组中该点的值的双精度值。这些都是以前使用过的,没有问题。

从我的 main 调用时(其中 RealX 和 RealY 是两个整数)

int currentFitness = getAverageNeighborhoodFitnessEvaluation(RealX,RealY);

总是有效

double currentFitness = getAverageNeighborhoodFitnessEvaluation(RealX,RealY);

导致分段错误

有谁知道什么可能性会导致这种情况和/或 int 可以取什么值但 double 似乎不能?

到目前为止,我已经将错误追溯到我们的代理实现

代理.cpp

#include "Agent.h"

Agent::Agent(void)
{
    m_age = 0;
    m_fitness = -1;
}

Agent::~Agent(void)
{
}

int Agent::GetAge()
{
    return m_age;
}

double Agent::GetFitness()
{
    return m_fitness;
}

void Agent::IncreaseAge()
{
    m_age++;
}

AgentType Agent::GetType()
{
    return m_type;
}

代理.h

#ifndef AGENT_H
#define AGENT_H

enum AgentType { candidateSolution, cupid, reaper, breeder};

class Agent
{
public:
    Agent(void);
    virtual ~Agent(void);

    double GetFitness();
    int GetAge();
    void IncreaseAge();
    AgentType GetType();
    virtual void RandomizeGenome() = 0;

protected:
    double m_fitness;
    AgentType m_type;
private:
    int m_age;
};
#endif // !AGENT_H

虽然似乎无法找到确切的问题

4

2 回答 2

0

从您对 gdb 调试器答案的评论中,我看到您正在GetFitness对空对象 ( Agent::GetFitness (this=0x0)) 调用该方法。这意味着neighborhoodEvaluations.at(i)返回一个空指针。at() 只检查是否越界,但如果放入数组中的开头是一个空指针,那at()将无济于事。为了防止这种情况,你应该改变

if ((*(neighborhoodEvaluations.at(i))) != NULL)

进入

if (neighborhoodEvaluations.at(i) != NULL)

如果neighborhoodEvaluations 不应该包含空指针,您将不得不追查为什么getNeighborhood()将它们放在那里。也许您正在为您的点集边缘的元素寻找越界邻居?

于 2012-10-29T14:09:42.430 回答
0

使用这篇文章http://www.cs.cmu.edu/~gilpin/tutorial/快速开始使用 gdb 调试器 。然后告诉我们哪一行产生了分段错误。

于 2012-10-29T12:59:55.980 回答