Изменение массивов между файлами и функциями в C

Я пытаюсь создать Sudoku Solver. Я также пытаюсь создать небольшие файлы для каждой задачи, чтобы у меня не было невероятно большого файла для отладки. Игнорируя ввод, мне нужно взять матрицу 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) Как только я перехожу к поиску пустого места в каждой строке [он же 0], я в конечном итоге изменяю только локальный массив, особенно когда мне приходится использовать циклы for, так что передается ли он по ссылке или передается по значению ( Мне все равно, какой) как я могу убедиться, что любые изменения, которые я делаю в файле/функции, возвращаются в то место, которое их вызвало?

(4) Есть ли способ использовать цикл для создания 9 массивов с одним вызовом команды/функции? Или мне нужно сделать 9 дискретных массивов и вызывать функцию 9 раз, каждый раз передавая номер строки?

  • Я пытался использовать указатели и адреса, но я продолжаю получать ошибки типа.
  • Я пытался передать сами массивы, но они разлагаются на указатели, которые не совсем работают как указатели (хотя, по общему признанию, мои знания об указателях не очень прочны).
  • Я пробовал гоняться за предупреждениями и ошибками, но данные ведут себя не так, как должны (проблемы с областью действия).
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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.
  2. Компьютер должен знать, насколько велика ваша матрица.
  3. используйте правильный тип для индексов
Ответ принят как подходящий

Чтобы рассматривать массив как копируемую переменную, вы можете обернуть массив в структуру:

#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]. Чтобы изменить Matrix или Row в функции, передайте ее как Matrix* или Row*. Чтобы ответить на ваш последний вопрос, вы также можете возвращать структуры из функции, чтобы вы могли возвращать Rows из функции-генератора.

Это определенно не лучший способ сделать это.

0___________ 22.02.2023 21:36

Другие вопросы по теме