繁体   English   中英

输出中的 C++ 奇怪数字

[英]C++ weird numbers in Output

所以我尝试重新创建 Conways Game of Life 并且我得到了很多工作,但是我的输出中有数字,我不知道它们来自哪里。 我对 c++ 和编程还很陌生,我以前学过 python 和 java,但我从来没有见过这个,谷歌似乎也没有理解我的问题,所以我希望你们人类也能理解。

我的输出如下:1664447571170186994045474010000255652800 /其对这个号码0000000000 00.11亿01.1亿0001000000 0000000000 0000000000 0000000000 0000000000 0000000000

任何人都知道他们来自哪里,因为我当然不知道。 有时这些数字甚至会像这样与棋盘“碰撞”:

0000-1-1-1-116644475711701869940 4547401010000000 791621423110000000 0101000000 0000000000 0000000000000000000

我的 sphagetthi 代码:

#include <iostream>

#include <chrono>
#include <thread> 


using namespace std;
using namespace std::this_thread;
using namespace std::chrono;

int main(){
    
    int x = 10, y = 10, i, j, c, b;
    int field[y][x] =
    
    {{ 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,1,1,0,0,0,0},
     { 0,0,0,0,1,0,1,0,0,0},
     { 0,0,0,0,1,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0}};
     
    int updateField[y][x];
    
    
    
    
    cout << "start";
    for(b = 0;b<=10; b++){
        cout << "main loop: "<<b<<"\n";
        for(y = 0; y < 10; y++)
        {
            
            for(x = 0; x < 10; x++)
            {
            
            c = 0;
            
            if(y == 0 || y == 9 || x == 0 || x == 9){
                
                
                
            }
            else{
            
                /*v v v lebende zelle v v v*/
                if(field[y][x] == 1){
                    
                    if(field[y-1][x-1] == 1){
                        c++;
                    }
                    if(field[y-1][x] == 1){
                        c++;
                    }
                    if(field[y-1][x+1] == 1){
                        c++;
                    }
                    if(field[y][x-1] == 1){
                        c++;
                    }
                    if(field[y+1][x-1] == 1){
                        c++;
                    }
                    if(field[y+1][x] == 1){
                        c++;
                    }
                    if(field[y+1][x+1] == 1){
                        c++;
                    }
                    if(field[y][x+1] == 1){
                        c++;
                    }
                    /*regeln v v v*/
                    if(c < 2 or c > 3){
                        updateField[y][x] = 0;
                    }
                    else
                    {
                        updateField[y][x] = 1;
                    }
                    
                    
                    
                    
                }
                /*^ ^ ^ lebende zelle ^ ^ ^*/
                /*v v v tote zelle v v v*/
                
                else if(field[y][x] == 0){
                    
                    if(field[y-1][x-1] == 1){
                        c++;
                    }
                    if(field[y-1][x] == 1){
                        c++;
                    }
                    if(field[y-1][x+1] == 1){
                        c++;
                    }
                    if(field[y][x-1] == 1){
                        c++;
                    }
                    if(field[y+1][x-1] == 1){
                        c++;
                    }
                    if(field[y+1][x] == 1){
                        c++;
                    }
                    if(field[y+1][x+1] == 1){
                        c++;
                    }
                    if(field[y][x+1] == 1){
                        c++;
                    }
                    /*regeln v v v*/
                    if(c == 3)
                    {
                        updateField[y][x] = 1; 
                    }
                    else
                    {
                        updateField[y][x] = 0;
                    }
                }
                
            }
            
        }
    }
    cout << "\n";
    for(i = 0; i < 10; i++){
        for(j = 0; j < 10; j++){
            field[i][j] = updateField[i][j];
        }
    }
        
        for(i = 0;i < x; i++){
            for(j = 0; j < y; j++ )
            {
                cout << field[i][j];
                
            }
        cout << "\n";
        }
        sleep_for(nanoseconds(500000000));
    }
    
    
    
}

我很感激任何答案。 提前致谢。

问题是您在构建updateField (组件中的 0 或 9)时忽略了边框,然后将包含这些边框的updateField复制到field updateField中的边界从未设置过,因此它们只包含之前内存中不受程序控制的任何数字。

您应该将updateField的边界设置为零,或者不要将边界复制到从 1 到排除 9 而不是从 0 到 10 迭代的field

虽然我希望这能解决您的问题,但我也想分享一些如何重构代码的想法。 例如,您可以使用布尔值数组而不是整数,因为根据游戏逻辑,这些值显然只能是 0 或 1。 扫描一个单元格的邻域也增加了许多可以缩短的冗余代码。 只需将以下内容视为有关可以完成的一些改进的一般想法:

#include <iostream>

#include <chrono>
#include <thread> 


using namespace std;
using namespace std::this_thread;
using namespace std::chrono;

int main(){
    
    int x = 10, y = 10, i, j, c, b;
    bool field[y][x] =
    
    {{ 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,1,1,0,0,0,0},
     { 0,0,0,0,1,0,1,0,0,0},
     { 0,0,0,0,1,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0},
     { 0,0,0,0,0,0,0,0,0,0}};//too lazy to rewrite to true/false, should also work this way
     
    bool updateField[y][x];
    
    
    
    
    cout << "start";
    for(b = 0;b<=10; b++){
        cout << "main loop: "<<b<<"\n";
        for(y = 0; y < 10; y++)
        {
            
            for(x = 0; x < 10; x++)
            {
            
            c = 0;
            
            if(y == 0 || y == 9 || x == 0 || x == 9){
                
                updateField[y][x] = false;
                
            }
            else{   
                for(i=-1;i<2;i++){
                    for(j=-1;j<2;j++){
                        if((i != 0 || j != 0) && field[y+i][x+j] == 1){// exclude i == j == 0
                            c++;
                        }
                    }
                }
                    
                if(field[y][x]){
                    if(c < 2 or c > 3){
                        updateField[y][x] = false;
                    }
                    else
                    {
                        updateField[y][x] = true;
                    }
                }else{
                    if(c == 3)
                    {
                        updateField[y][x] = true; 
                    }
                    else
                    {
                        updateField[y][x] = false;
                    }
                }
                
            }
            
        }
    }
    cout << "\n";
    for(i = 0; i < 10; i++){
        for(j = 0; j < 10; j++){
            field[i][j] = updateField[i][j];
        }
    }
        
        for(i = 0;i < x; i++){
            for(j = 0; j < y; j++ )
            {
                cout << field[i][j];
                
            }
        cout << "\n";
        }
        sleep_for(nanoseconds(500000000));
    }
    
    
    
}

如果您也初始化 updateField,那么奇怪的数字就会消失。 由于这个 if 语句,updatefield 的边缘不会更新:

                if (y == 0 || y == 9 || x == 0 || x == 9) ;
                    else {

///long statements
                        if (c < 2 || c > 3) {
                            updateField[y][x] = 0;
                        }
                        else
                        {
                            updateField[y][x] = 1;
                        }
                  }

此外,您应该更一致地使用变量,例如您将地图定义为 x*y 大小,但稍后在 for 循环中您将 x 和 y 的最大值指定为 10。

你看到的是未初始化内存的内容。 当你声明int updateField[y][x]; 编译器为您保留了适当的内存空间,但它不会为您初始化内存,因此它包含任何已经存在的随机垃圾。

要解决此问题,请在运行循环之前将updateField初始化为与 field 相同:

for (int i = 0; i < y; ++i) {
    for (int j = 0; j < x; ++j) {
        updateField[i][j] = field[i][j];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM