Моя проблема в том, что после замены почти всех нулей в векторе натуральными числами программа останавливается без сбоя программы или какого-либо выходного кода. Мой вектор не отображается на экране после нескольких итераций цикла без прохождения цикла до конца.
Это консоль, отображающая выходные данные другой программы. Здесь все закончилось правильно с кодом 0.
Вот что мне дает программа. Как будто это не закончено. Я не понимаю, почему он не завершается с каким-то кодом.
Я пытался использовать отладчик, но он не обнаружил сбоя
Код:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <thread>
using namespace std;
int main() {
setlocale(LC_ALL, "ru");
srand(static_cast<unsigned int>(time(NULL)));
int delayInSeconds = 1; // Delay in seconds
int D = 20;
int T = 14;
int K1 = 4;
int K2 = 8;
int N = 8;
int k;
int probability;
int x, y;
vector<vector<int>> N_N(N, vector<int>(N, 0)); // field
for (int i = 0; i < D; i++) {
// Every day we increase the number of days lived in each bact by 1
for (int f = 0; f < N; f++) { for every cell of the field
for (int l = 0; l < N; l++) {
if (N_N[f][l] != 0) // if there is a bacterium
N_N[f][l] = N_N[f][l] + 1; // increase its number of days lived by 1
}
}
//adding k bacteria
k = rand() % (K2 - K1) + K1;
for (int j = 0; j < k; j++) { // for every k
bool added = false;
do { // iterate over coordinates until all bacteria can be inserted
x = rand() % N;
y = rand() % N;
if (N_N[x][y] == 0) {
N_N[x][y] = 1;
added = true;
}
} while (!added);
}
//simulation of bacterial death
for (int a = 0; a < N; a++) { //for every cell of the field
for (int b = 0; b < N; b++) {
if (N_N[a][b] >= T / 2) { // if the life of the bacterium is greater than T:2
probability = rand() % 100; // probability
if (probability <= 2) // if probability < 2%
N_N[a][b] = 0; // the bacterium dies and the cell is released
}
}
}
// simulation of bacterial reproduction
if (i > 0) { // "next and every day"
for (int c = 0; c < N; c++) {
for (int d = 0; d < N; d++) {
if (N_N[c][d] <= T) { // "after T days after appearance, the bacterium stops reproducing"
probability = rand() % 100; // probability of occurrence for each bacterium
if (probability <= 5 && c < N && d + 1 < N){ // if it is less than 5% and if the coordinates do not go beyond the field
if (N_N[c][d + 1] == 0) // if the cell is empty
N_N[c][d + 1] = 1; // birth of bacteria
}
probability = rand() % 100;
if (probability <= 5 && c - 1 >= 0 && d + 1 < N) {
if (N_N[c - 1][d + 1] == 0)
N_N[c - 1][d + 1] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c - 1 >= 0 && d < N) {
if (N_N[c - 1][d] == 0)
N_N[c - 1][d] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c - 1 >= 0 && d - 1 >= 0) {
if (N_N[c - 1][d - 1] == 0)
N_N[c - 1][d - 1] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c < N && d - 1 >= 0) {
if (N_N[c][d - 1] == 0)
N_N[c][d - 1] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c + 1 < N && d - 1 >= 0) {
if (N_N[c + 1][d - 1] == 0)
N_N[c + 1][d - 1] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c + 1 < N && d < N) {
if (N_N[c + 1][d] == 0)
N_N[c + 1][d] = 1;
}
probability = rand() % 100;
if (probability <= 5 && c + 1 < N && d + 1 < N) {
if (N_N[c + 1][d + 1] == 0)
N_N[c + 1][d + 1] = 1;
}
}
}
}
}
// output on display
for (int e = 0; e < N; e++) {
for (int f = 0; f < N; f++) {
if (N_N[e][f] == 0)
cout << " " << " ";
if (N_N[e][f] != 0)
cout << N_N[e][f] << " ";
}
cout << endl;
}
//this_thread::sleep_for(chrono::seconds(1));
/*auto start = chrono::steady_clock::now();
while (chrono::duration_cast<chrono::seconds>(chrono::steady_clock::now() - start).count() < delayInSeconds) {}*/
/*if (i < D - 1)
system("cls");*/
}
return 0;
}
Сделайте несколько шагов назад и удалите весь код, кроме определения вектора и вывода. Получаете ли вы тогда кучу новых строк? Измените определение вектора, чтобы использовать 1
вместо 0
, тогда вы получите много вывода 1
? Это означает, что вывод работает, а ошибка находится где-то в другом месте вашего кода. Добавляйте этот код обратно очень небольшими частями, пока он не перестанет работать. Затем вы должны получить представление о том, когда и где может возникнуть проблема.
что должен делать код? Что он делает вместо этого? Притворитесь, что мы ничего не знаем о вашей задаче, потому что велика вероятность, что на самом деле мы этого не знаем.
@pptaszni, мне также пришлось прочитать его дважды, но ОП на самом деле заявляет, что он останавливается без сбоев и что нет «выходного кода» (полагаю, они относятся к коду выхода, который в случае sefault или аналогичного будет отличаться от 0 и указано на консоли), но они не утверждают, что вывода вообще не будет. Хотя я согласен, вопрос следует уточнить
Я работаю в Visual Studio и вывожу вектор на консоль после каждой итерации основного цикла. Сначала вектор выводится и все работает как надо, но потом программа просто останавливается. Он не выдает мне никакого кода ошибки, как обычно. Однако основной цикл не завершен.
Мой код должен моделировать небольшую колонию бактерий, которые могут размножаться и умирать. Моделирование происходит в течение определенного количества дней D. Основной цикл удаляет эти бактерии после каждого дня. Числа, заполняющие вектор, — это количество дней, прожитых бактерией.
пожалуйста отредактируйте вопрос, чтобы уточнить. Комментарии предназначены только для комментариев, при этом вся необходимая информация должна быть в вопросе.
«Останавливается», то есть больше ничего не происходит, но программа не завершается (указание бесконечного или длительного цикла или чего-то подобного)? Или «останавливается», как при выходе из программы, когда этого не должно быть? Пожалуйста, ]отредактируйте свой вопрос, чтобы предоставить нам более подробную информацию.
А вы пробовали запускать программу через отладчик? Он не ловит сбой? Как насчет использования отладчика для пошагового выполнения кода и просмотра того, что произойдет?
«добавление k бактерий» будет выполняться вечно, если пустых позиций меньше k.
bool added = false;
do { // iterate over coordinates until all bacteria can be inserted
x = rand() % N;
y = rand() % N;
if (N_N[x][y] == 0) {
N_N[x][y] = 1;
added = true;
}
} while (!added);
Что будет, если на каждый x
и y
будет свой N_N[x][y] != 0
? Здесь у вас бесконечный цикл.
@Banicsidy, даже если есть 1 свободное место, этот цикл становится очень неэффективным, когда N становится большим. Вы можете очень часто выбрасывать случайное число со многими повторениями, прежде чем найдете 1 свободное место. Вместо того, чтобы прокручивать число на каждой итерации, вы можете использовать вектор с индексами из 0....N-1
и случайным образом перетасовать его. Затем повторите его от начала до конца. Либо вы найдете позицию, либо нет, и в этом случае вы знаете, что ее нет. Это все еще не оптимально (например, очень плохая локальность памяти), но намного лучше, чем то, что у вас есть сейчас.
«Чат GPT не может решить мою проблему» — очевидно. Он может написать университетское эссе по философии на первом курсе, а не код на C++.