Как я могу инициализировать 2d Array без строк или столбцов и создать функцию, которая принимает пользовательский ввод, а затем обновляет 2d массив? - PullRequest
0 голосов
/ 10 ноября 2019

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

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

Это специальная подсказка:

"GetData (): написать функцию, которая принимает ссылку на двумерный массив, ссылку на переменные, одну для числа строк и другую для числа столбцов в качестве параметра. Функция принимает количество строк и числовых столбцов в качестве пользовательского ввода и обновляет переданную ему переменную. Затем она принимает входные данные для матрицы на основе количества строк и столбцов. "

#include <stdio.h>
    void GetData(int *rows, int *columns, int matrix[][*columns]);
    void Display(int rows, int columns, int matrix[][columns]);
    int main(void) 
    {
        int r1, c1, r2, c2;
        int m1[r1][c1];
        int m2[r2][c2];
        printf("Working for Matrix 1\n");
        GetData(&r1,&c1,m1);
        Display(r1,c1,m1);



        return 0;

    }

    void GetData(int *rows, int *columns, int matrix[][*columns])
    {
        // maybe instead of void it needs to return an integer pointer?
        int a, b, i, j,k;
        printf("Enter number of rows and columns: ");
        scanf("%d %d",&a,&b);
        *rows = a;
        *columns = b;
        printf("Enter data for %dx%d matrix",*rows,*columns);
        for(i = 0;i<*rows;i++)
        {
            printf("\nrow %d\n",i+1);
            for(j=0;j<*columns;j++)
            {
                scanf("%d",&k);
                matrix[i][j] = k;
            }
        }
    }

    void Display(int rows, int columns, int matrix[][columns])
    {
        int i, j;
        for (i=0;i<rows;i++)
        {
            for(j=0;j<columns;j++)
                printf("%4d",matrix[i][j]);
        }
    }

Когда этот кодзапускается, также есть ошибка сегментации, я не слишком уверен, что это означает или что это вызывает.

1 Ответ

1 голос
/ 10 ноября 2019

Когда вы объявляете: int m1[r1][c1], r1 и c1 являются унифицированными . Таким образом, компилятор понятия не имеет, насколько большим сделать m1. Аналогично для m2.

Если вы скомпилировали с (например) -O2 -Wall, компилятор пометит это для вас.

Вам нужно что-то вроде:

int
main(void)
{

    int r1 = 10;
    int c1 = 12;
    int m1[r1][c1];

    int r2 = 5;
    int c2 = 7;
    int m2[r2][c2];

    ...

    return 0;
}

Однако вы запрашиваете у пользователя размеры массива в GetData, но это слишком поздно в процессе. Я бы переместил эту подсказку в main:

int
main(void)
{
    int nrow;
    int ncol;

    printf("Enter number of rows and columns: ");
    scanf("%d %d", &nrow, &ncol);

    int m1[nrow][ncol];
    int m2[nrow][ncol];

    ...

    return 0;
}
...