Вектор не выводится на консоль

Моя проблема в том, что после замены почти всех нулей в векторе натуральными числами программа останавливается без сбоя программы или какого-либо выходного кода. Мой вектор не отображается на экране после нескольких итераций цикла без прохождения цикла до конца.

Это консоль, отображающая выходные данные другой программы. Здесь все закончилось правильно с кодом 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;

}

«Чат GPT не может решить мою проблему» — очевидно. Он может написать университетское эссе по философии на первом курсе, а не код на C++.

pptaszni 15.05.2024 14:15

Сделайте несколько шагов назад и удалите весь код, кроме определения вектора и вывода. Получаете ли вы тогда кучу новых строк? Измените определение вектора, чтобы использовать 1 вместо 0, тогда вы получите много вывода 1? Это означает, что вывод работает, а ошибка находится где-то в другом месте вашего кода. Добавляйте этот код обратно очень небольшими частями, пока он не перестанет работать. Затем вы должны получить представление о том, когда и где может возникнуть проблема.

Some programmer dude 15.05.2024 14:17
godbolt.org/z/f88Pnboh9 - что-то отображает, и не вылетает. Можете ли вы уточнить свой вопрос?
pptaszni 15.05.2024 14:19

что должен делать код? Что он делает вместо этого? Притворитесь, что мы ничего не знаем о вашей задаче, потому что велика вероятность, что на самом деле мы этого не знаем.

463035818_is_not_an_ai 15.05.2024 14:31

@pptaszni, мне также пришлось прочитать его дважды, но ОП на самом деле заявляет, что он останавливается без сбоев и что нет «выходного кода» (полагаю, они относятся к коду выхода, который в случае sefault или аналогичного будет отличаться от 0 и указано на консоли), но они не утверждают, что вывода вообще не будет. Хотя я согласен, вопрос следует уточнить

463035818_is_not_an_ai 15.05.2024 14:32

Я работаю в Visual Studio и вывожу вектор на консоль после каждой итерации основного цикла. Сначала вектор выводится и все работает как надо, но потом программа просто останавливается. Он не выдает мне никакого кода ошибки, как обычно. Однако основной цикл не завершен.

Banicsidy 15.05.2024 14:33

Мой код должен моделировать небольшую колонию бактерий, которые могут размножаться и умирать. Моделирование происходит в течение определенного количества дней D. Основной цикл удаляет эти бактерии после каждого дня. Числа, заполняющие вектор, — это количество дней, прожитых бактерией.

Banicsidy 15.05.2024 14:38

пожалуйста отредактируйте вопрос, чтобы уточнить. Комментарии предназначены только для комментариев, при этом вся необходимая информация должна быть в вопросе.

463035818_is_not_an_ai 15.05.2024 14:40

«Останавливается», то есть больше ничего не происходит, но программа не завершается (указание бесконечного или длительного цикла или чего-то подобного)? Или «останавливается», как при выходе из программы, когда этого не должно быть? Пожалуйста, ]отредактируйте свой вопрос, чтобы предоставить нам более подробную информацию.

Some programmer dude 15.05.2024 14:46

А вы пробовали запускать программу через отладчик? Он не ловит сбой? Как насчет использования отладчика для пошагового выполнения кода и просмотра того, что произойдет?

Some programmer dude 15.05.2024 14:47

«добавление k бактерий» будет выполняться вечно, если пустых позиций меньше k.

Caleth 15.05.2024 14:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
11
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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 и случайным образом перетасовать его. Затем повторите его от начала до конца. Либо вы найдете позицию, либо нет, и в этом случае вы знаете, что ее нет. Это все еще не оптимально (например, очень плохая локальность памяти), но намного лучше, чем то, что у вас есть сейчас.

463035818_is_not_an_ai 15.05.2024 15:13

Другие вопросы по теме