You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++细菌模拟程序中途停止无输出问题求助

C++细菌模拟程序异常终止问题排查与修复

问题症状

编写的细菌模拟程序运行时,当二维vector网格几乎所有0被自然数替换后,程序无崩溃提示、无退出码就停止运行,外层循环未执行完毕,网格内容也无法继续输出。其他程序可正常以退出码0结束,调试器未捕获到崩溃情况。

核心问题定位

程序卡死在添加新细菌的逻辑中:当网格被细菌完全填满(没有值为0的单元格)时,do-while循环会无限执行——循环内不断随机生成坐标,但永远找不到空单元格,added变量始终为false,导致程序无法继续执行后续逻辑,表现为"停止运行"。

// 问题代码片段
for (int j = 0; j < k; j++) {  // 逐个添加细菌
    bool added = false;

    do {   // 循环直到找到可插入的坐标
        x = rand() % N;
        y = rand() % N;

        if (N_N[x][y] == 0) {
            N_N[x][y] = 1;
            added = true;
        }
    } while (!added);
}

修复方案

采用给添加循环设置最大尝试次数的思路,防止无限阻塞,同时优化部分冗余逻辑:

完整修复代码

#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;
    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));

    for (int i = 0; i < D; i++) {  
        // 每日细菌存活天数+1
        for (int f = 0; f < N; f++) {
            for (int l = 0; l < N; l++) {
                if (N_N[f][l] != 0)
                    N_N[f][l]++;
            }
        }

        // 添加k个细菌(修复死循环问题)
        k = rand() % (K2 - K1) + K1;   
        for (int j = 0; j < k; j++) {
            bool added = false;
            int maxAttempts = N * N * 2; // 设置最大尝试次数,避免死循环
            int attempts = 0;

            do {
                x = rand() % N;
                y = rand() % N;

                if (N_N[x][y] == 0) {
                    N_N[x][y] = 1;
                    added = true;
                }
                attempts++;
            } while (!added && attempts < maxAttempts);
            
            // 若尝试次数耗尽仍未添加成功,输出提示并终止后续添加
            if (!added) {
                cout << "网格已满,无法添加新细菌" << endl;
                break;
            }
        }

        // 细菌死亡逻辑
        for (int a = 0; a < N; a++) {
            for (int b = 0; b < N; b++) {
                if (N_N[a][b] >= T / 2) {
                    probability = rand() % 100;
                    if (probability <= 2)
                        N_N[a][b] = 0;
                }
            }
        }

        // 细菌繁殖逻辑(优化为方向数组,简化重复代码)
        if (i > 0) {
            for (int c = 0; c < N; c++) {
                for (int d = 0; d < N; d++) {
                    if (N_N[c][d] <= T) {
                        const int directions[8][2] = {
                            {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
                            {0, -1}, {1, -1}, {1, 0}, {1, 1}
                        };

                        for (const auto& dir : directions) {
                            int newC = c + dir[0];
                            int newD = d + dir[1];
                            if (newC >= 0 && newC < N && newD >=0 && newD < N) {
                                probability = rand() % 100;
                                if (probability <= 5 && N_N[newC][newD] == 0) {
                                    N_N[newC][newD] = 1;
                                }
                            }
                        }
                    }
                }
            }
        }

        // 输出网格
        for (int e = 0; e < N; e++) {
            for (int f = 0; f < N; f++) {
                if (N_N[e][f] == 0)
                    cout << "  ";
                else
                    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. 给细菌添加逻辑增加了maxAttempts最大尝试次数,当网格满员时会自动终止当前添加流程,避免死循环
  2. 繁殖逻辑使用方向数组简化了重复的坐标判断代码,提升可读性和可维护性
  3. 增加了网格满员时的提示信息,便于排查运行状态

内容的提问来源于stack exchange,提问作者Banicsidy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:34:49