0

こんにちは、私は初心者レベルのプログラマーで、取り組んでいるプログラムに問題があります。ポイントは、ランダムに生成された数値からなる配列を 1 つのプライベート変数とし、配列のサイズと、配列を使用して個体の適合度を表す数値を持つ個体クラスを作成することです。

ヘッダー ファイル、ヘッダーのソース ファイル、およびソース ファイルを使用してヘッダーをテストします。何らかの理由で、コンパイルしようとするたびにブレークポイントに到達し、Visual Studio はエラーの内容を教えてくれません。クラスのプライベート ポインターと関係があると思われますが、エラーを修正する理由や方法がわかりません。

ヘッダ

#ifndef INDIVIDUAL_H
#define INDIVIDUAL_H

class individual
{   
    int size;
    double fitness;
    double* genotype;
public:
    individual(int pSize = 10);
    individual(const individual& copy);
    ~individual();
    double* getGenotype();
    double getFitness();
    int getSize();
    void mutation();
    void crossover(individual a);
};

#endif

ヘッダー ソース

#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>
#define M_PI 3.14159265358979323846
#define M_E 2.71828182845904523536
#include <cmath>
#include "individual.h"

using namespace std;

double RandomFloat(double min = -32.768, double max = 32.768)
{
    min = min;
    max = max;
    unsigned int seed;
    seed = (unsigned int) time(0) + rand();
    srand(seed);
    double r = (double)rand() / (double)RAND_MAX;
    return min + r * (max - min);
}

double Fitness(double a[], int size)
{
    double fitness;
    double firstSum, secondSum;

    firstSum = 0;
    for(int i = 0; i<size; i++)
    {
        firstSum += a[i]*a[i];
    }
    firstSum /= size;

    secondSum = 0;
    for(int i = 0; i<size; i++)
    {
        secondSum += cos(2*M_PI*a[i]);
    }
    secondSum /= size;

    fitness = -20*exp(-0.2*sqrt(firstSum) - exp(secondSum) + 20 + M_E);

    return fitness;
}

individual::individual(int pSize)
{
    size = pSize;
    genotype = nullptr;
    genotype = new double(size);
    for(int i = 0; i<size; i++)
    {
        genotype[i] = RandomFloat();
    }

    fitness = Fitness(genotype,size);
}    

individual::individual(const individual& copy)
    :size(copy.size),genotype(new double[copy.size])
{    
    std::copy(copy.genotype, copy.genotype + copy.size, genotype);
}

individual::~individual()
{
    delete[] genotype;
}

double* individual::getGenotype()//returns a pointer
{
    return genotype;
}

double individual::getFitness()
{
    return fitness;
}

int individual::getSize()
{
    return size;
}

void individual::mutation()
{
    int first, second;
    double temp;
    first = (int)RandomFloat();
    second = (int)RandomFloat();

    temp = genotype[first];
    genotype[first] = genotype[second];
    genotype[second] = temp;
}

void individual::crossover(individual a)
{
    int crossPoint = size/3 - 1;

    for(int i = crossPoint; i<size; i++)
    {
        double temp1;

        temp1 = 0;
        temp1 = genotype[i];
        genotype[i] = a.genotype[i];
        a.genotype[i] = temp1;
    }

}

ドライバーソース

#include <iostream>
#include <string>
#include <stdlib.h>
#include <cmath>
#include <vector>
#include "individual.h"
#define M_PI 3.14159265358979323846
#define M_E 2.71828182845904523536

using namespace std;

int main()
{
    individual test;
    int size = test.getSize();
    cout << size << endl;

    for(int i = 0; i<size; i++)
    {
        cout << test.getGenotype()[i] << endl;
    }
    return 0;
}

考えられる解決策を探してみましたが (コピー コンストラクターとデストラクタを追加しました)、何も問題を解決していないようです。どんな助けでも大歓迎です。

4

1 に答える 1

1

double の配列を割り当てるには

変化する:

genotype = new double(size);  // this initialize one double and initialize value to size

genotype = new double[size];  // this creates an array which size is 'size'

double を 1 つだけ割り当ててデータをメモリに書き込むと、コードがメモリをオーバーランします。

for(int i = 0; i<size; i++)
{
    genotype[i] = RandomFloat();
}
于 2013-02-09T01:54:57.457 に答える