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

问题描述 投票:0回答:2

我正在尝试构建一个数独求解器。我还试图为每个任务创建小文件,这样我就没有一个不可能的大文件来调试。忽略输入,我需要采用 9x9 矩阵并将其拆分为 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) 一旦我去解决每一行中的空白空间 [aka the 0],我最终只会修改本地数组,尤其是当我必须使用 for 循环时,所以无论是按引用传递还是按值传递(我真的不在乎哪个)我如何确保我在文件/函数中所做的任何修改都能回到调用它的地方?

(4) 有没有一种方法可以通过一个命令/函数调用循环生成9个数组?或者我是否需要制作 9 个离散数组并调用函数 9 次,每次传递一个行号?

  • 我试过使用指针和地址,但我不断收到类型错误。
  • 我试过传递数组本身,但它们分解成指针,不能像指针那样工作(诚然,尽管我对指针的了解不是非常扎实)。
  • 我试过追踪警告和错误,但数据的行为不正常(范围问题)。
arrays c function pointers multidimensional-array
2个回答
1
投票
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;
}
  1. 您需要将指针返回到
    int
    而不是
    int
  2. 计算机必须知道你的矩阵有多大。
  3. 使用正确的索引类型

0
投票

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

#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]
更好的语法。

© www.soinside.com 2019 - 2024. All rights reserved.