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();配列内のそのポイントの値を表すdoubleを返します。これらはすべて以前は問題なく使用されていました。

メインから呼び出された場合(RealXとRealYは2つの整数です)

int currentFitness = getAverageNeighborhoodFitnessEvaluation(RealX,RealY);

常に動作します

double currentFitness = getAverageNeighborhoodFitnessEvaluation(RealX,RealY);

セグメンテーション違反を引き起こします

誰かがこれにどのような可能性が生じる可能性があるか、および/またはintが取ることができるが、doubleはできないように見える値を知っていますか?

これまでのところ、エージェントの実装にエラーを追跡しました

Agent.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;
}

Agent.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

この記事http://www.cs.cmu.edu/~gilpin/tutorial/を使用して、gdbデバッガーをすばやく開始します 。次に、どの行がセグメンテーション違反を生成するかを教えてください。

于 2012-10-29T12:59:55.980 に答える
0

GetFitnessgdbデバッガーの回答に対するコメントから、nullオブジェクト()でメソッドを呼び出していることがわかりますAgent::GetFitness (this=0x0)。これはneighborhoodEvaluations.at(i)、nullポインタを返していることを意味します。at()は範囲外をチェックするだけですが、最初に配列に入れられたものがnullポインターである場合、at()役に立ちません。これを防ぐには、変更する必要があります

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

の中へ

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

NeighborhoodEvaluationsにnullポインターが含まれていないと想定される場合は、それらをそこに配置する理由を追跡するgetNeighborhood()必要があります。おそらく、ポイントのセットの端にある要素の範囲外のネイバーを探していますか?

于 2012-10-29T14:09:42.430 に答える