Я пытаюсь добавить две матрицы, используя 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
Однако мой операнд легко является указателем.
Проблема в том, что методы:
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;
};
Мой выдает следующую ошибку: «примечание: ожидается 'int', но аргумент имеет тип 'int () [3]'»