"left of 'm' must have class, struct or union type" i think it definitely does :d what am I doing wrong?

#include<iostream>
#include<ctime>
#include<random>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxgeneration = 1000;
const int popsize = 50;
const int mutation = 1;
const double crossover = 0.8;
const int gensize = 20;
const int vl = 0;
const int vu = 4;


default_random_engine dre(time(0));
uniform_int_distribution<int> di(vl, vu);
int k = di(dre);

struct phage;
struct bacteria {

int fitness = 0;

int m[gensize] = { 1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,1,0 };

void evaluate(phage b) {

for (int i = 0; i<gensize; i++)
fitness += m[i] == b.m[i]; // this seems impossible why?

}


void init() {
for (int i = 0; i<gensize; i++)
m[i] = di(dre);
}
void show() {
{
for (int i = 0; i<gensize; i++)
cout << m[i];
}
cout << endl << endl;
}


}b;
struct phage {


int fitness = 0;

int m[gensize] = { 1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,0,1,0 };

void evaluate(bacteria b) {

for (int i = 0; i<gensize; i++)
fitness += m[i] == b.m[i];

}


void init() {
for (int i = 0; i<gensize; i++)
m[i] = di(dre);
}
void show() {
{
for (int i = 0; i<gensize; i++)
cout << m[i];
}
cout << endl << endl;
}
};

// pg is time

default_random_engine dre1(time(0));
uniform_int_distribution <int> di1(0, 19);


default_random_engine dre2(time(0)); // albatobistvis
uniform_int_distribution<int> di2(1, 100);

default_random_engine dre3(time(0)); // mutaciistvis
uniform_int_distribution<int> di3(vl, vu);

// pg is time


phage crosmut(phage p1, phage p2) {
phage shvili;
// krosoveri
for (int i = 0; i < gensize; i++)
shvili.m[i] = -1;

int k = di1(dre);

int k1 = di1(dre);

for (int i = 0; i < k1; i++)
shvili.m[i] = p1.m[i];

for (int i = k1; i < gensize; i++)
shvili.m[i] = p2.m[i];
// mutacia





for (int i = 0; i < gensize; i++)
if (di2(dre2) <= mutation) shvili.m[i] = di3(dre3);



return shvili;
}


void pg(phage population[]) {




for (int i = 25 /* popsize / 2*/; i <30 /*(popsize / 2) + (popsize / 4)*/; i++)
population[i] = population[popsize - 1];



for (int i = 31 /*(popsize / 2) + (popsize / 4)*/; i < popsize; i++)
population[i] = crosmut(population[popsize - 2], population[popsize - 3]);

for (int i = 2; i < popsize; i++)
population[i].fitness = 0;

for (int i = 0; i < popsize; i++)
population[i].evaluate(b);



sort(population, population + popsize, [](phage p, phage p1) {return p.fitness < p1.fitness; });


//for (int i = 2; i < popsize; i++)
//population[i].fitness = 0;



}

int main() {


phage population[popsize];
for (int i = 0; i < popsize; i++)
population[i].init();


for (int i = 0; i < popsize; i++)
population[i].evaluate(b);
sort(population, population + popsize, [](phage p, phage p1) {return p.fitness < p1.fitness; });

for (int i = 0; i < 100; i++) {
cout << population[popsize - 1].fitness << endl;
population[popsize - 1].show();


pg(population);

cout << population[popsize - 1].fitness << endl;
population[popsize - 1].show();
}


}
You need to delay defining bacteria::evaluate until the compiler has seen the full (non-forward) declaration of phage.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct phage;   // forward declaration
struct bacteria {
    // ...
    void evaluate(phage b);
    // ...
};

struct phage {
    //...
};

void bacteria::evaluate(phage b) {
    for (int i = 0; i<gensize; i++)
        fitness += m[i] == b.m[i]; // this seems impossible why?
}
//... 


There is, by the way, a very good possibility that all of your default_random_engine objects will be initialized with the same seed.
Last edited on
cire thank you so much!
Topic archived. No new replies allowed.