Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62

Копирую строчки двумерного массива и программа начинает вести себя странно

13.08.2011, 20:07. Показов 1054. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, есть некоторый полузапиленный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <conio.h>
#include <time.h> 
using namespace std;
 
void showmass(int**, int, int);
void showmass(int*, int);
void showmass(double*, int);
int fitness (int*, int);
void cross(int*&, int*&, int);
void cross(int*&, int*&, int*&, int);
int main()
{
    srand(time(NULL));
    setlocale(0,"");
    int dm1 = 0, dm2 = 10;
    cout << "Введите размер популяции" << endl;
    cin >> dm1;
    cout << endl;
    int** popul = new int*[dm1];
    for (int i = 0; i < dm1; i++){
        popul[i] = new int[dm2];
    }
    for (int i = 0; i < dm1; i++){
        for (int j = 0; j < dm2; j++){
            popul[i][j] = rand()%2;
        }   
    }
    double* fitn = new double[dm1];
    int sum_pop = 0;
    for (int i = 0; i < dm1; i++){
        sum_pop= sum_pop + fitness(popul[i], dm2);
        fitn[i] = fitness(popul[i], dm2);
    }
    for (int i = 0; i < dm1; i++){
        fitn[i] = fitn[i]/sum_pop;
    }
    showmass(popul, dm1, dm2);
    cout << endl;
    showmass(fitn, dm1);
    cout << endl;
    //------------------------------
    //Селекция
    //------------------------------
    
    int* intermid = new int[5];
    for (int j = 0; j < 5; j++){
        int pos = 0;
        double tmp = 0;
        for (int i = 0; i < dm1; i++){
            if (tmp < fitn[i]){
                pos = i;
                tmp = fitn[i];
            }                       
        }
        intermid[j] = pos;
        fitn[pos] = 0;      
    }   
    showmass(intermid, 5);
    //--------------------
    //Вот тут
    popul[0] = popul[3];
    //--------------------
    showmass(popul, dm1, dm2);
    _getch();
 
    for (int i = 0; i < dm1; i++){
        delete[] popul[i];  
    }
    delete[] popul;
    delete[] fitn;
    delete[] intermid;
    return 0;
}
int fitness (int* ind, int lng){
    int fitness = 0;
    for (int i = 0; i < lng; i++){
        fitness = fitness + ind[i];
    }
    return fitness;
}
void showmass(int** mass, int dm1, int dm2){
    for (int i = 0; i < dm1; i++){
        for (int j = 0; j < dm2; j++){
            cout << mass[i][j] << " ";
        }
    cout << endl;
    }
}
void showmass(int* mass, int dm1){
    for (int i = 0; i < dm1; i++){
        cout << mass[i]<< " ";
        
    }
    cout << endl;
}
void showmass(double* mass, int dm1){
    for (int i = 0; i < dm1; i++){
        cout << mass[i]<< " ";
        
    }
    cout << endl;
}
void cross(int*& gen1, int*& gen2, int len){
    int pos = rand()%len;
    cout << pos << endl;
    int buff = 0;
    for(int i = 0; i < (len-pos); i++){
       buff = gen1[i];
       gen1[i] = gen2[i];
       gen2[i] = buff;
   }
}
void cross(int*& gen1, int*& gen2, int*& gen3, int len){
    int pos = rand()%len;
    cout << pos << endl;
    for(int i = 0; i < (len-pos); i++){
       gen3[i] = gen1[i];
   }
    for(int i = pos; i < len; i++){
       gen3[i] = gen2[i];
   }
}
В чем проблема: место где написано "Вот тут", почему-то с добавлением этой строчки, окно консольки после всех вычислений перестает закрываться. Просто становится неактивным и все. Если закрыть по красному крестику, то выдается следующее сообщение:
Поток 'Поток Win32' (0xe10) завершился с кодом -1073741510 (0xc000013a).
Поток 'Поток Win32' (0x13b8) завершился с кодом -1073741510 (0xc000013a).
Программа "[3616] listen.exe: Машинный код" завершилась с кодом -1073741510 (0xc000013a).
Подскажите, что делаю неправильно?
И еще вдогонку вопрос, в функциях showmass надо ли удалять в конце динамические массивы? Насколько я понимаю, программа ведь создает для функции отдельный массив, получается надо это делать?

Добавлено через 26 минут
Забыл добавить, среда visual c++ 2008
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2011, 20:07
Ответы с готовыми решениями:

При непродолжительной работе ноута мышь начинает себя странно вести(увеличивается чувствительность)
Недавно столкнулся с такой проблемой.При непродолжительной работе ноута мышь начинает себя странно вести(увеличивается...

Странно стал вести себя HDD
Жесткий диск стал издавать звук, словно разгоняется , потом треск, снова разгоняется и опять треск. Перестала работать ОС. Сразу...

Видеокарта Radeon HD 7970 начала странно себя вести при нагрузке
Привет, форум. Позавчера общались с другом по скайпу и играли, внезапно изображение на экране превратилось в сплошные вертикальные...

5
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
13.08.2011, 20:08
Цитата Сообщение от Woody-krsk Посмотреть сообщение
В общем, есть некоторый полузапиленный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    //--------------------
    /*не вот тут . 
        ps: когда будете удалять память получите exception, 
        ибо удалится popul[0], а когда дойдет до popul[3], удалять нечего будет.
        ну и ещё будет проблема, если dm1<=3 ибо popul[3] не будет существовать.
        */
    popul[0] = popul[3];
    //--------------------
    showmass(popul, dm1, dm2);
      // а вот тут, оно ждет вашего нажатия на любую клавишу.
    _getch();
 
}
И еще вдогонку вопрос, в функциях showmass надо ли удалять в конце динамические массивы? Насколько я понимаю, программа ведь создает для функции отдельный массив, получается надо это делать?
кто создает, где создает?
прочитайте про передачу массивов в функцию, вопросы отпадут.
0
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
14.08.2011, 06:46  [ТС]
silentnuke, я понимаю зачем у меня в коде _getch(), я говорю о том, что после того, как я нажму любую клавишу, программа не завершается, если присутствует указанная строка. Причем вчера нашел, что если сделать так:
C++
1
2
3
for(int i = 0; i < dm2; i++){
        popul[0][i] = popul[3][i];
    }
то проблема исчезает, только я не понимаю почему так, поскольку строки и в первом случае копировались, только с неприятным эффектом. На 0 и 3 не смотрите, я просто пробовал, там потом будут переменные, за пределы не выйду.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
14.08.2011, 17:09
popul - указатель на указатель
popul[i] - указатель на целое

C++
1
2
3
4
5
6
popul[0] = popul[3]; // теперь popul[0] указывает туда же куда и popul[3] 
...
        for (int i = 0; i < dm1; i++){
                delete[] popul[i]; // при попытке удалить повторно popul[3] 
                                  // привет access violation
        }
вместо вашего решения можно также юзать memmove()
0
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
14.08.2011, 18:58
я об этом же и говорил.

насчет gecth (), только что специально запустил первый код, нажал клавишу, все прекрасно завершилось, правда access violation прилетел, как и говорил вначале.
0
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
15.08.2011, 04:40  [ТС]
silentnuke, ааа, теперь понял, спасибо огромное!
Я просто совсем новичок, потому неразжеванный вариант ответа не понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2011, 04:40
Помогаю со студенческими работами здесь

Пару дней назад процессор (AMD Phenom II X6 1075T) начал странно себя вести
Такая ситуация Пару дней назад процессор (AMD Phenom II X6 1075T) начал странно себя вести До У меня работают 4 сервера + опера...

Странно видёт себя программа
Написал программу конвертор валют но при выборе валюты программа сразу пишет ответ. #include &lt;iostream&gt; using namespace std; ...

Программа ведет себя очень странно
Конкретно: Стартую поток... FThread := TWorkerThread.Create(true); FThread.FreeOnTerminate := true; FThread.Start; ...

класс string. Программа странно себя ведет
Программа странно себя ведет. После первого ввода имени и номера сотрудника, пропускает последующие вводы имен, переходя сразу к номеру. ...

Программа, работающая с Oracle, на другой машине ведет себя странно
Здравствуйте! Такая проблема. Написала маленькое приложение на C# для работы с Oraclом. На моем компьютере, на котором она собственно и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru