【问题标题】:Copy a 3 dim array in itself复制一个 3 dim 数组本身
【发布时间】:2016-01-11 09:21:47
【问题描述】:

我必须在 C 中创建一个数独游戏,对于“撤消”功能,我想复制前 3 个暗淡。数组进入下一个。

问题是我的程序在i=j=0 时崩溃了,所以它甚至没有开始复制数组。

这是我所拥有的:

void copydim(int sudoku[z][9][9])
{
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            sudoku[dim + 1][i][j] = sudoku[dim][i][j];
        }
    }
}

z 定义为 10。

ij 是数独的行和列。

这里是调用:它是一个简单的 switch 指令,当用户按下 1 时应该复制数独

case 49:
    if (sudoku[dim][yvek][xvek] >= 0)
    {
        copydim(sudoku[z][9][9]); /*my debugger says that the sudoku array has the right values here, but in the next step when my programm switches into the copydim function there are no more values and an error occurs, although the pointer to the sudoku is the same as in this function :(*/
        sudoku[dim][yvek][xvek] = 1;
        editanzeige(sudoku, x, y);
    }
    break;

我的数组声明在我的主函数中。

【问题讨论】:

  • dim 是什么?当代码“中断”时它的价值是什么?
  • 您好像忘记初始化dim,是吗?只要dim 有一个有用的值,这段代码就应该可以工作。顺便说一句,“代码中断”不是一个非常有用的错误报告。段错误?
  • 不好意思我忘了,dim的值是用0声明的,停止的时候也是0
  • 没有足够的上下文来识别问题。请显示copydim 的调用以及传递给它的数组的声明。
  • 把 dim++ 放在 j 循环之后..

标签: c arrays copy


【解决方案1】:

评论中的这一行:

copydim(sudoku[z][9][9]);

在数独数组的单个实例中传递单个字段。

事实上,一个超出 sudoku[][9][9] 数组的单个实例范围的字段。这是未定义的行为,可能会导致段错误事件。

真正需要的是传递一个地址。

copydim( &sudoku );

建议:

#define MAX_ROWS (9)
#define MAX_COLS (9)
#define MAX_GAMEBOARDS (10)

struct gameboard
{
    int rows[ MAX_ROWS ];
    int cols[ MAX_COLS ];
};

// declare the array of gameboards with name `sudoku`
struct gameboard sudoku[ MAX_GAMEBOARDS];

int dim =0;

copydim() 的原型为:

void copydim( struct gameboard * );

子函数被调用的地方:

int main( void )
{
    ...
    copydim(sudoku);
    ...
    return 0;
}

【讨论】:

    【解决方案2】:

    您发布的原始copydim 代码没有任何问题。

    但是,如果传入的数组未分配(null),它会崩溃,如果dimdim + 1 超出数组的边界,可能会崩溃。

    错误在调用代码中。

    【讨论】:

      【解决方案3】:

      我犯了一个错误... 调用copydim是错误的

      copydim(sudoku[z][9][9]); 
      

      必须是copydim(sudoku);

      非常感谢您的尝试 :) 尽管如此,我还是学到了很多如何在未来写下我的问题:D

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-08
        • 2016-10-20
        • 2022-12-11
        • 1970-01-01
        • 2015-06-16
        • 2021-06-18
        • 2022-11-25
        • 1970-01-01
        相关资源
        最近更新 更多