Возврат массива двумерных массивов в C - PullRequest
2 голосов
/ 20 июля 2011

Во-первых, я признаю, что это домашняя работа, но прошло около шести лет с тех пор, как я последний раз программировал на C, и с тех пор, как я программировал только на Python и Java.

Я хочу создать последующие 2D-массивы для 2D-массива, например:

[1][2][3] 
[4][5][6] 
[7][8][ ]

Для вышеупомянутого 2D-массива последующие 2D-массивы будут иметь вид:

[1][2][3]
[4][5][6]
[7][ ][8] 

и

[1][2][3]
[4][5][ ]
[7][8][6]

Это не было бы проблемой, если бы я просто поместил код для этого в метод main ().

Однако я хочу отделить код для этой части, инкапсулировать его в функцию и просто вызывать его, когда мне это нужно. Другими словами, я хочу сгенерировать оба массива из функции и вернуть их оба.

В Си это не так просто, потому что я не могу создать функцию, которая может передавать массив двумерных массивов.

У меня есть несколько идей, таких как

  1. возвращает структуру с 2d-массивом и следующей переменной, которая является указателем на другой последующий 2D-массив (я хочу обработать все последующие массивы в цикле).

  2. создайте глобальный указатель, в котором я буду указывать голову на первую структуру, которая, в свою очередь, указывает на следующий массив 2ces-наследников и так далее.

Но я не совсем уверен, какой именно попробовать. Ищете другие полезные выводы.

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Чтобы вернуть массив двумерных массивов:

int*** getArrayOf2DArrays(int num_arrays, int rows_per_array, int cols_per_array)
{
    int*** arr = malloc(num_arrays * sizeof(int**));
    // check that arr isn't null

    for(int i = 0; i < num_arrays; i++)
    {
        arr[i] = malloc(rows_per_array * sizeof(int*));
        // again, check result

        for(int j = 0; j < rows_per_array; j++)
        {
            arr[i][j] = malloc(cols_per_array * sizeof(int));
            // yet again, check result

            // NOT necessary, but if you want to initialize the values
            // here, you could. Either use memset or:
            for(int k = 0; k < cols_per_array; k++)
                arr[i][j][k] = 0;
        }
    }

    return arr;
}

И тогда вы можете получить к нему доступ с помощью arr[array_number][row][col].Обязательно освободите его, когда закончите (аналогичный процесс, только в обратном порядке):

void freeArrayOf2DArrays(int*** arr, int num_arrays, int rows_per_array)
{
    // sanity checks here
    for(int i = 0; i < num_arrays; i++)
    {
        // and here
        for(int j = 0; j < rows_per_array)
            // and here
            free(arr[i][j]);
        free(arr[i]);
    }

    free(arr);
}

И, конечно, вы можете просто передать этот указатель любой из ваших функций, используя тип данных int***.

1 голос
/ 20 июля 2011

Массив двумерных массивов - это всего лишь трехмерный массив, поэтому вы можете передавать их так же, как параметры / возвращаемые значения. Поскольку у вас фиксированный размер в двух измерениях, может быть намного проще просто использовать тип int * и рассматривать его как трехмерный массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...