在C中修改文件和函数之间的数组

fzsnzjdm  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(117)

我正在尝试构建一个数独解算器。我也在尝试为每个任务创建小文件,这样我就不用调试一个大得无法想象的文件。忽略输入,我需要取9 x9矩阵并将其拆分为9个值的9个数组。我想这样做:

int main()
{
    int Matrix[9][9] = {
        [0,2,3,4,5,6,7,8,9],
        [1,0,3,4,5,6,7,8,9],
        [1,2,0,4,5,6,7,8,9],
        [1,2,3,0,5,6,7,8,9],
        [1,2,3,4,0,6,7,8,9],
        [1,2,3,4,5,0,7,8,9],
        [1,2,3,4,5,6,0,8,9],
        [1,2,3,4,5,6,7,0,9],
        [1,2,3,4,5,6,7,8,0]
        };

    int Row[9] = SplitMatrix(Matrix);
    return 0;
}

SplitMatrix看起来像这样:

int Array[9];

int SplitMatrix(int Matrix[][])    
{
    for (int i=0; i<9; i++)
    {
        for (int j=0; j<9; j++)
        {
            Array[j] = Matrix[i][j];
        }

        return Array;
    }
}

我不断遇到的错误要么是类型错误(int vs int*),要么是赋值性错误,当然还有发送/接收正确数据的失败。
我的主要问题是:
(1)数组是不可赋值的,那么我如何从一个函数中获取返回值,并将其转换为一个数组以便以后传递呢?
(2)数组在发送到函数时分解为(伪)指针,那么我如何在文件/函数之间发送和接收整个数组数据,而不仅仅是第一个索引的地址呢?
(3)一旦我去解决每一行中的空格[也就是0],我最终只修改了局部数组,特别是当我必须使用for循环时,所以无论是通过引用传递还是通过值传递(我真的不在乎是哪个),我如何确保我在文件/函数中所做的任何修改都返回到调用它的地方?
(4)有没有一种方法可以通过一次命令/函数调用使用循环生成9个数组?或者我需要生成9个离散数组并调用函数9次,每次传递一个行号?

  • 我试过使用指针和地址,但总是遇到类型错误。
  • 我尝试过传递数组本身,但是它们分解成指针,而指针的工作方式不太像指针(尽管我对指针的了解并不十分扎实,这是公认的)。
  • 我尝试过跟踪警告和错误,但是数据没有按照它应该的方式运行(范围问题)。
t3psigkw

t3psigkw1#

int *SplitMatrix(size_t rows, size_t cols, int (*Matrix)[cols])
{
    int *Array = malloc(rows * sizeof(*Array));
    if(Array)
        for (size_t i=0; i<rows; i++)
        {
            for (size_t j=0; j<cols; j++)
            {
                 Array[j] = Matrix[i][j];
            }
    }
    return Array;
}
/* .... */
int *Row = SplitMatrix(Matrix);
/* some code */
free(Row);

1.您需要将指针返回到int,而不是int
1.计算机必须知道你的矩阵有多大。
1.使用正确的索引类型

pnwntuvh

pnwntuvh2#

若要将数组视为可复制赋值变量,可以将数组 Package 在结构中:

#include <stdio.h>

typedef struct {
  int items[9];
} Row;

typedef struct {
  Row rows[9];
} Matrix;

int main() {
  Matrix a = {{
    {0,2,3,4,5,6,7,8,9},
    {1,0,3,4,5,6,7,8,9},
    {1,2,0,4,5,6,7,8,9},
    {1,2,3,0,5,6,7,8,9},
    {1,2,3,4,0,6,7,8,9},
    {1,2,3,4,5,0,7,8,9},
    {1,2,3,4,5,6,0,8,9},
    {1,2,3,4,5,6,7,0,9},
    {1,2,3,4,5,6,7,8,0},
  }};

  // Structs allow copy assignment
  Matrix b = a;
  
  printf("matrix: %d\n", b.rows[1].items[1]);
  return 0;
}

C++允许比b.rows[1].items[1]更好的语法。要修改函数中的MatrixRow,请将其作为Matrix*Row*传入。为了回答您的最后一个问题,您还可以从函数返回结构体,以便从生成器函数返回Row s。

相关问题