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; }
修复说明
- 给细菌添加逻辑增加了
maxAttempts最大尝试次数,当网格满员时会自动终止当前添加流程,避免死循环 - 繁殖逻辑使用方向数组简化了重复的坐标判断代码,提升可读性和可维护性
- 增加了网格满员时的提示信息,便于排查运行状态
内容的提问来源于stack exchange,提问作者Banicsidy
相关产品推荐
相关产品推荐

