Фоб » 10 июн 2008, 20:49
Эх, великоват он... я думал, может кто с общих позиций чего подскажет... ну да ладно, вот: (лишнее я всё жостко повырезал, иначе нефорумных размеров код был бы)
Код: Выделить всё
class promoter{ // элемент дерева экспрессии/ингибирования
public:
int* a; // тот самый массив, в чей нулевой элемент незаконно вписывают хрень
int a_size;
void add_leaf(int leaf_n){ // процедура наращивания того самого массива а, в чей нулевой элемент попадает хрень
if (!a_size){
a_size = 1;
a = new int[a_size];
a[0] = leaf_n; // тут всё нормально записывается - проверял
}
else{
int* temp_a = new int[a_size + 1];
int i;
for (i = 0; i < a_size; i++)
temp_a[i] = a[i];
temp_a[a_size] = leaf_n;
delete(a); // кстати, эта инструкция не лишняя часом?
a_size++;
a = new int[a_size];
for (i = 0; i < a_size; i++){
a[i] = temp_a[i];
}
}
}
};
class gene{
public:
vector<promoter> eTree;
vector<promoter> iTree;
genome* myGenome;
gene(int tree_size, int an, genome* g){
int i;
myGenome = g;
for (i = 0; i < tree_size; i++)
add_random_promoter(); // тут заполняются eTree и iTree
}
};
class genome{
public:
float* p; // когда пишем в этот массив, в а[0] одного из vector<gene> genes (а в нём одного из eTree) пишется хрень
vector<gene> genes;
int p_length; // по умолчанию = 9
int p_real; // по умолчанию = 9
int p_feel; // по умолчанию = 6
genome(){};
genome(int p_r, int p_f, int rgenes){
p_feel = p_f;
p_real = p_r;
p_length = p_r;
p = new float(p_length);
int i;
for (i = 0; i < rgenes; i++)
create_random_gene(1 + random(INIT_TREE_SIZE));
}
void create_random_gene(int pep_dep = 1){
int n = p_feel + random(p_length - p_feel + 1);
if (n == p_length){
p_length++;
p = new float[p_length];
}
genes.push_back(gene(pep_dep, n, this));
}
void update_perception(float* obj_p){
int i;
for (i = 0; i < p_feel; i++)
p[i] = obj_p[i]; // !!! цикл №1, после которого в нулевой элемент одного из массивов а пишется хрень; (замечу, что p_feel == 6, что меньше, чем длина массива p, равная 9)
}
void genes_work(){
int i;
int c_range = p_length - p_feel;
float* temp_p = new float[c_range];
for (i = 0; i < c_range; i++)
temp_p[i] = 0;
for (i = 0; i < genes.size(); i++) {
int j;
for (j = 0; j < genes[i].eTree.size(); j++) {
if (genes[i].eTree[j].a_size) {
if (genes[i].eTree[j].a[0] > 10) {
genes[i].eTree[j].a[0] = 1;
}
}
}
temp_p[genes[i].n - p_feel] = p_or(temp_p[genes[i].n - p_feel], genes[i].work());
}
for (i = p_feel; i < p_length; i++) { //
p[i] = temp_p[i - p_feel]; // !!! цикл №2, после которого в нулевой элемент одного из массивов а может попасть хрень;
} //
}
};
Эх, великоват он... я думал, может кто с общих позиций чего подскажет... ну да ладно, вот: (лишнее я всё жостко повырезал, иначе нефорумных размеров код был бы)
[code]
class promoter{ // элемент дерева экспрессии/ингибирования
public:
int* a; // тот самый массив, в чей нулевой элемент незаконно вписывают хрень
int a_size;
void add_leaf(int leaf_n){ // процедура наращивания того самого массива а, в чей нулевой элемент попадает хрень
if (!a_size){
a_size = 1;
a = new int[a_size];
a[0] = leaf_n; // тут всё нормально записывается - проверял
}
else{
int* temp_a = new int[a_size + 1];
int i;
for (i = 0; i < a_size; i++)
temp_a[i] = a[i];
temp_a[a_size] = leaf_n;
delete(a); // кстати, эта инструкция не лишняя часом?
a_size++;
a = new int[a_size];
for (i = 0; i < a_size; i++){
a[i] = temp_a[i];
}
}
}
};
class gene{
public:
vector<promoter> eTree;
vector<promoter> iTree;
genome* myGenome;
gene(int tree_size, int an, genome* g){
int i;
myGenome = g;
for (i = 0; i < tree_size; i++)
add_random_promoter(); // тут заполняются eTree и iTree
}
};
class genome{
public:
float* p; // когда пишем в этот массив, в а[0] одного из vector<gene> genes (а в нём одного из eTree) пишется хрень
vector<gene> genes;
int p_length; // по умолчанию = 9
int p_real; // по умолчанию = 9
int p_feel; // по умолчанию = 6
genome(){};
genome(int p_r, int p_f, int rgenes){
p_feel = p_f;
p_real = p_r;
p_length = p_r;
p = new float(p_length);
int i;
for (i = 0; i < rgenes; i++)
create_random_gene(1 + random(INIT_TREE_SIZE));
}
void create_random_gene(int pep_dep = 1){
int n = p_feel + random(p_length - p_feel + 1);
if (n == p_length){
p_length++;
p = new float[p_length];
}
genes.push_back(gene(pep_dep, n, this));
}
void update_perception(float* obj_p){
int i;
for (i = 0; i < p_feel; i++)
p[i] = obj_p[i]; // !!! цикл №1, после которого в нулевой элемент одного из массивов а пишется хрень; (замечу, что p_feel == 6, что меньше, чем длина массива p, равная 9)
}
void genes_work(){
int i;
int c_range = p_length - p_feel;
float* temp_p = new float[c_range];
for (i = 0; i < c_range; i++)
temp_p[i] = 0;
for (i = 0; i < genes.size(); i++) {
int j;
for (j = 0; j < genes[i].eTree.size(); j++) {
if (genes[i].eTree[j].a_size) {
if (genes[i].eTree[j].a[0] > 10) {
genes[i].eTree[j].a[0] = 1;
}
}
}
temp_p[genes[i].n - p_feel] = p_or(temp_p[genes[i].n - p_feel], genes[i].work());
}
for (i = p_feel; i < p_length; i++) { //
p[i] = temp_p[i - p_feel]; // !!! цикл №2, после которого в нулевой элемент одного из массивов а может попасть хрень;
} //
}
};
[/code]