Напишите функцию, которая находит самый большой элемент 2D-массива в C

По сути, мне нужно делать то, что написано в названии. Я делал это пару раз полностью внутри main(), и это довольно просто, но никогда не внутри отдельной функции, поэтому у меня возникли некоторые проблемы с тем, как обрабатывать указатели при обращении к многомерному (в данном случае 2D) массиву. Полное название задачи: Напишите отдельную функцию, которая находит самый большой элемент 2D-массива, состоящего из размеров n * m, где 2 ‹= n‹ = 5 и 2 ‹= m‹ = 8. Вы должны заполнить матрицу в main() типом данных int и распечатать результат функции, используя "%d".

Вот что я до сих пор придумал:

#include <stdio.h>

int search(int **M , int x , int y){
    
    int i , j;
    
    int max;
    
    for(i=0; i<x; i++){
        for(j=0; j<y; j++){
            if(M[i][j] > max){
                max = M[i][j];
            }
        }
    }
    
    return max;
}

int main(){
    
    int n , m;
    
    do{
        scanf("%d" , &n);
        
    }while(n<2 || n>5);
    
    do{
        scanf("%d" , &m);
        
    }while(m<2 || m>8);
    
    int A[n][m];

    int i , j;

    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
            scanf("%d" , &A[i][j]);
        }
    }

    int r = search(**A , n , m);
    
    printf("RESULTS:\n");
    printf("%d" , r);
    
    return 0;
}

И вот какие ошибки отображает мой компилятор при запуске программы:

main.c:48:24: warning: passing argument 1 of ‘search’ makes pointer from integer without a cast [-Wint-conversion]

main.c:7:9: note: expected ‘int **’ but argument is of type ‘int’

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


person Toky    schedule 16.03.2021    source источник
comment
int r = search(**A , n , m); должен быть int r = search(A , n , m);, потому что A - двойной указатель, но когда вы разыменовываете его, вы получаете значение внутри, а это означает, что **A эквивалентно A[0][0], который является только первым элементом.   -  person Jerry Jeremiah    schedule 16.03.2021


Ответы (3)


VLA на победу :-)

#include <stdio.h>
#include <stdlib.h>

int search(int rows, int cols, int M[rows][cols]) { // VLA, M must be after rows/cols
    int max = M[0][0];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (M[i][j] > max) {
                max = M[i][j];
            }
        }
    }
    return max;
}

int main(void) {
    int n, m;
    //scanf("%d%d", &n, &m);
    n = 4; m = 7;

    int A[n][m];                             // VLA
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            A[i][j] = rand() % 1000;
            printf("%4d", A[i][j]);
        }
        puts("");
    }

    int r = search(n, m, A);
    printf("RESULTS: %d\n", r);

    return 0;
}

Функция search() принимает VLA аргумент с указанными значениями.
После этого просто обрабатывайте M как обычно для массива.

person pmg    schedule 16.03.2021

Массивы в C не такие, как в Java. Допустим, у вас есть массив

array = {{1,2},{3,4}}

Чтобы получить доступ к этому элементу, все, что вам нужно сделать, это выполнить итерацию по всему массиву. Элементы укладываются в память один за другим. Все, что вам нужно сделать, чтобы получить 3:

array[2]

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

person Cronos    schedule 16.03.2021

Вы должны изменить эту строку, удалив **

int r = search(**A , n , m);

Становится

int r = search(A , n , m);
person Rudy Barbieri    schedule 16.03.2021