Реализация двумерного массива в памяти с использованием C - PullRequest
0 голосов
/ 02 февраля 2020

Актуальный вопрос - Найти седловую точку в матрице.

Мой вызов функции - find_saddle_point((Arr,rows);

Прототип моей функции - void find_saddle_point(int *,int);

Инициализация -

int rows , column ;

int Arr[rows][column];

Предупреждение - предупреждение: передача аргумента 1 'find_saddle_point' из несовместимого типа указателя

Мое временное решение - find_saddle_point(((int *)Arr,rows);

1 Ответ

1 голос
/ 02 февраля 2020

Вы объявили двумерный массив.

int Arr[rows][column];

Используется в выражениях, как в этом вызове функции

find_saddle_point((Arr,rows);

, он неявно преобразуется в указатель на свой первый элемент и имеет тип int ( * )[column].

Однако соответствующий параметр имеет тип int * и неявное преобразование из типа int ( * )[column] в тип int *.

void find_saddle_point(int *,int);

, поэтому компилятор выдает ошибку.

Что касается вашего временного "решения"

find_saddle_point(((int *)Arr,rows);

, то это может привести к неопределенному поведению.

Объявить функцию как

void find_saddle_point( int, int, int [][*]);

В ее определении вы должны указать имена параметров.

void find_saddle_point( int row, int column, int [][column])
{
    // ...
}

Также для измерений массивов лучше использовать тип size_t вместо типа int.

Вот демонстрационная программа.

#include <stdio.h>

void find_saddle_point( size_t, size_t, int a[][*] );

void fill( size_t rows, size_t cols, int a[][cols] )
{
    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            a[i][j] = i * cols + j;
        }
    }
}

int main(void) 
{
    size_t rows = 3;
    size_t cols = 5;

    int a[rows][cols];

    fill( rows, cols, a );

    for ( size_t i = 0; i < rows; i++ )
    {
        for ( size_t j = 0; j < cols; j++ )
        {
            printf( "%2d ", a[i][j] );
        }
        putchar( '\n' );
    }

    return 0;
}

Выходные данные:

 0  1  2  3  4 
 5  6  7  8  9 
10 11 12 13 14

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

...