Передача 2D-массива по ссылке в функцию

Я пытаюсь добавить две матрицы, используя 2D-массивы в C. Здесь я передаю имя массива в качестве параметра, который, я думаю, передается по ссылке. Однако я не могу добавить массивы. Что-то не так в функции add, я не могу добавить массивы.

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

#include<stdio.h>
void input(int*,int*);
void add(int*,int*,int*);
void display(int*);

int main()
{
int a[3][3],b[3][3],sum[3][3];
 input(a,b);
 add(a,b,sum);
 display(sum);
 return 0;
 }

void input(int*a,int*b)
{
    for(int i = 0;i<3;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("Enter the element at a[%d][%d]",i+1,j+1);
            scanf("%d",((a+i)+j));
        }
    }
    for(int i = 0;i<3;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("Enter the element at b[%d][%d]",i+1,j+1);
            scanf("%d",((b+i)+j));
        }
    }
}
    void add(int* a,int*b,int*sum)
    {
        for(int i =0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                *(sum[i]+j) = *(a[i]+j) + *(b[i]+j);//error at this line
            }
        }
    }
 
 void display(int* sum)
  {
      printf("The sum is:\n");
      for(int i =0;i<3;i++)
      {
          for(int j =0;j<3;j++)
          {
            printf("%d ",(sum[i]+j));
          }
           printf("\n");
      }
  }

Я получил следующую ошибку

operand of '*' must be a pointer

Однако мой операнд легко является указателем.

Мой выдает следующую ошибку: «примечание: ожидается 'int', но аргумент имеет тип 'int () [3]'»

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

Ответы 2

Ответ принят как подходящий

Проблема в том, что методы:

void input(int*, int*);
void add(int*, int*, int*);
void display(int*);

ожидается указатель, однако вы передаете им 2D-массивы (статически выделенные), а именно int a[3][3], b[3][3], sum[3][3];. Поэтому, как уже указывалось в комментариях, эти 2D-массивы будут преобразованы в 'int (*)[3]'. Следовательно, вам необходимо адаптировать сигнатуру ваших методов к:

void input(int [][3], int [][3]);
void add(int [][3], int [][3], int [][3]);
void display(int [][3]);

и

void input(int a[][3], int b[][3]){
      // the code
}

void add(int a [][3], int b [][3], int sum [][3]){
      // the code
}

void display(int sum [][3]){
      // the code
}    

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

Здесь я передаю имя массива в качестве параметра, который, я думаю, является пропуском по ссылке. Однако я не могу добавить массивы. Что-то не так в добавить функцию, я не могу добавить массивы

Вы можете использовать int* или использовать int[][], но вам нужно написать программу в соответствии с требованиями каждого случая. Я покажу вам пример обоих случаев.

о вашей программе

  • не используйте void. Это вообще пустая трата, иногда ошибка. Что-то вернуть.
  • пишите в общем. Сравнивать:
 void display(int* sum)
  {
      printf("The sum is:\n");
      for(int i =0;i<3;i++)
      {
          for(int j =0;j<3;j++)
          {
            printf("%d ",(sum[i]+j));
          }
           printf("\n");
      }

  }

с

void display_a(int s[][3], int l, const char* msg)
{
    if ( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
        printf("%d ", s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return;
};

Во втором случае вы можете использовать ту же функцию для отображения ЛЮБОГО массива s, а также написать простой заголовок. Обратите внимание, что в C вы можете опустить все измерения вектора, кроме последнего. На самом деле C не имеет многомерного массива, например. Фортран есть. И передавать количество строк и сообщение в качестве параметров у вас гораздо больше, чем просто использовать как вы написали.

  • НИКОГДА не пишите

    printf("Enter the element at a[%d][%d]",i+1,j+1);
     scanf("%d",((a+i)+j));
    

всегда проверяйте возврат scanf(). scanf() не предназначен для чтения с клавиатуры. Используйте хотя бы один пробел в каждом приглашении. Это намного удобнее для пользователя.

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

Пример

выход

Using arrays

Matriz A at [1][1] 1
Matriz A at [1][2] 2
Matriz A at [1][3] 3
Matriz A at [2][1] 4
Matriz A at [2][2] 5
Matriz A at [2][3] 6
Matriz B at [1][1] 6
Matriz B at [1][2] 5
Matriz B at [1][3] 4
Matriz B at [2][1] 3
Matriz B at [2][2] 2
Matriz B at [2][3] 1
The 1st matrix:
1 2 3
4 5 6

The 2nd matrix:
6 5 4
3 2 1

The sum (using arrays) is:
7 7 7
7 7 7

Using pointers

Matriz A at [1][1] 2
Matriz A at [1][2] 3
Matriz A at [1][3] 4
Matriz A at [2][1] 5
Matriz A at [2][2] 6
Matriz A at [2][3] 7
Matriz B at [1][1] 7
Matriz B at [1][2] 6
Matriz B at [1][3] 5
Matriz B at [2][1] 4
Matriz B at [2][2] 3
Matriz B at [2][3] 2
The 1st matrix:
2 3 5
5 6 7

The 2nd matrix:
7 6 4
4 3 2

The sum (using pointers) is:
9 9 9
9 9 9


Using t1 t2

The t1 matrix:
1 2 3
4 5 6
7 8 9

The t2 matrix:
9 8 7
6 5 4
3 2 1

t1 + t2 (using pointers) is:
10 10 10
10 10 10
10 10 10

код

этот код использует все, что я пытался объяснить, я полагаю. Обратите внимание на то, как вы пишете код при использовании указателей: вы используете только адрес и смещение. Скобки не нужны.

#include<stdio.h>

void    add_a(int[][3],int[][3],int[][3],int);
void    display_a(int[][3],int,const char*);
int     input_a(int[][3], int, const char*);

void    add_p(int*,int*,int*,int);
void    display_p(int*,int,const char*);
int     input_p(int*, int, const char*);

int main(void)
{
    int t1[][3] =
    {
        { 1,2,3 },
        { 4,5,6 },
        { 7,8,9 }
    };

    int t2[][3] =
    {
        { 9,8,7 },
        { 6,5,4 },
        { 3,2,1 }
    };
    
    int a[3][3];
    int b[3][3];
    int sum[3][3];

    printf("Using arrays\n\n");

    input_a(a,2,"Matriz A");
    input_a(b,2,"Matriz B");
    display_a(a, 2, "The 1st matrix:");
    display_a(b, 2, "The 2nd matrix:");

    add_a( a,b,sum, 2 );
    display_a(sum, 2, "The sum (using arrays) is:");

    printf("Using pointers\n\n");

    input_p((int*) a,2,"Matriz A");
    input_p((int*) b,2,"Matriz B");
    display_p( (int*) a, 2, "The 1st matrix:");
    display_p( (int*) b, 2, "The 2nd matrix:");

    add_p(  (int*) a, (int*) b, (int*) sum, 2 );
    display_p( (int*) sum, 2, "The sum (using pointers) is:");


    printf("\nUsing t1 t2 \n\n");

    display_p( (int*) t1, 3, "The t1 matrix:");
    display_p( (int*) t2, 3, "The t2 matrix:");

    add_p(  (int*) t1, (int*) t2, (int*) sum, 3 );
    display_p( (int*) sum, 3, "t1 + t2 (using pointers) is:");

    return 0;
};

void add_a(
    int a[][3],
    int b[][3],
    int sum[][3],
    int l // lines
    )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            sum[i][j] = a[i][j] + b[i][j];
    return;
};
 
void display_a(int s[][3], int l, const char* msg)
{
    if ( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
        printf("%d ", s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return;
};

 int input_a(int a[][3], int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d",&a[i][j]);
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};

void add_p( int*a, int* b, int* sum, int l  )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            *(sum + i*l + j) =  *(a + i*l + j) + *(b + i*l + j);
    return;
};
 
void display_p(int* s, int l, const char* msg)
{
    if ( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
            printf("%d ", *( s + i*l + j) );
        printf("\n");
    };
    printf("\n");
    return;
};

 int input_p(int* a, int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d", (a + i*l + j) );
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};

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