【发布时间】:2015-05-09 19:20:27
【问题描述】:
我正在研究基因进化的神经网络。我在 2008 年使用 Visual Studio 2005 编写了一个程序。现在我将程序转换为支持 c++11 的 Eclipse(Linux) 和 VS 2013(Win) 项目。运行后,两个项目都报同样的错误:
获取临时地址[-fpermissive]
经过大量搜索后,我发现这个错误是因为新的 C++ 标准不允许获取临时对象的地址。由于所有对象都是使用“新”创建的(所以我想它们应该一直可用)。我部分解决了问题,但不知道如何解决。如果您运行 eclipse 项目,它将仅突出显示项目中的两个错误。
因为它需要完整的代码来检查,所以很难用语言来解释,所以我在 git 上托管了 eclipse 项目 https://bitbucket.org/a-akram/geans.git,我让每个人都可以访问它。
主要问题在于变量wp1 和wp2。 m_vPopulatin 是一个包含神经网络地址的向量。
CNeuralNetwork* CGeneticEngine::Evolve()
{
CLearningEngine *l;
double totalError = 0.0;
for (int iter = 0;iter < CGN_MAXITER; iter++)
{
for (int i = 0;i < CGN_POPULATION; i++)
{
l = new CLearningEngine(m_vPopulation[i]);
l->Run(m_vTrainingDataset);
for(unsigned int p = 0; p < m_vTrainingDataset->size(); p++)
{
totalError = totalError + m_vPopulation[i]->getm_dTotalNetworkError();
totalError = totalError/m_vTrainingDataset->size();
}
if (totalError < CGN_THRESHOLD)
return m_vPopulation[i];
m_dErrors[i] = totalError;
}
SortFitnesses();
NewPopulation();
}
return NULL;
}
void CGeneticEngine::NewPopulation()
{
int id1, id2;
double temp;
std::vector <CSynapticConnection *> *wp1;
std::vector <CSynapticConnection *> *wp2;
for (int i=0;i<CGN_POPULATION / 2;i++)
{
id1 = rand() % CGN_POPULATION / 2;
id2 = rand() % CGN_POPULATION / 2 + CGN_POPULATION / 2;
wp1 = &m_vPopulation[id1]->getm_vListofSynaptics();
wp2 = &m_vPopulation[id2]->getm_vListofSynaptics();
// Cross over the weights.
for (int j = 0; j < 2; j++)
{
temp = (*wp1)[j+6]->getWeight();
(*wp1)[j+6]->setWeight((*wp2)[j+6]->getWeight() );
(*wp2)[j+6]->setWeight(temp);
}
// adding slight genetic change due to crossover randomly.
if (rand() % 10 < 2)
{
for(unsigned int j = 0; j < wp1->size();j++)
(*wp1)[j]->changeWeight((double)(rand())/(32767/2) - 1);
for(unsigned int j = 0; j < wp2->size();j++)
(*wp2)[j]->changeWeight((double)(rand())/(32767/2) - 1);
}
}
}
由于这是我在这个论坛上的第一个问题,所以我可能措辞不好,所以我要求版主暂时不要关闭它。如有必要,我会说得更清楚。但是有了项目文件,你们就很容易找出问题和解决方案。
非常感谢您帮助解决问题...如果您需要更多信息,请告诉我。
【问题讨论】:
-
“C++ 标准不允许获取临时对象的地址” 你的意思是堆栈上的对象?您可以获取这些地址;在函数返回后它们将不再有效。此外,没有人会克隆您的项目;请在问题本身中包含MCVE。
-
你在哪里删除
l?使用智能指针。 -
@Neil Kirk:感谢您强调智能指针。我将使用智能指针...因为这是我正在修改为当前 C++11 标准的旧代码...
标签: c++ neural-network genetic-algorithm temporary-objects