Рассмотрим отправленную функцию ввода
void input(int* r1,int* r2,int* c1,int* c2,int arr1[*r1][*c1],int arr2[*r2][*c2]) {/* */}
Количество строк и столбцов обоих массивов передается как указатели, намерение изменить их значение внутри функции, но они также инициализируются равными нулю за пределамифункции и , используемые для вычисления параметров VLA, фактически двух массивов нулевого размера.Это не может быть сделано.
Жизнеспособным подходом было бы сначала запросить у пользователя размеры, проверить, являются ли они действительными, и только потом объявить массивы и передать их различным функциям.Что-то вроде следующего.
#include <stdio.h>
#include <stdlib.h>
typedef int value_t;
int input_matrix( const char *format, size_t rows, size_t cols, value_t mat[rows][cols] );
void print_matrix( const char *format, size_t rows, size_t cols, value_t mat[rows][cols] );
int ask_matrix_dimensions( const char *msg, int *rows, int *cols );
void multiply_matrices( size_t rows, size_t inner, size_t cols,
value_t mat_a[rows][inner], value_t mat_b[inner][cols],
value_t mult[rows][cols] );
int main(void)
{
int ra, ca;
if ( ask_matrix_dimensions("the first matrix", &ra, &ca) != 2 )
return EXIT_FAILURE;
int rb, cb;
if ( ask_matrix_dimensions("the second matrix", &rb, &cb) != 2 )
return EXIT_FAILURE;
if ( ca != rb )
{
fputs("Error: Wrong dimensions, the two matrices cannot be multiplied.", stderr);
return EXIT_FAILURE;
}
value_t mat_a[ra][ca];
if ( input_matrix("%d", ra, ca, mat_a) == EOF )
return EXIT_FAILURE;
value_t mat_b[rb][cb];
if ( input_matrix("%d", rb, cb, mat_b) == EOF )
return EXIT_FAILURE;
puts("\nMatrix a:");
print_matrix("%3d", ra, ca, mat_a);
puts("Matrix b:");
print_matrix("%3d", rb, cb, mat_b);
value_t mat_c[ra][cb];
multiply_matrices(ra, ca, cb, mat_a, mat_b, mat_c);
puts("Matrix b:");
print_matrix("%4d", ra, cb, mat_c);
return EXIT_SUCCESS;
}
int input_matrix( const char *format, size_t rows, size_t cols, value_t mat[rows][cols] )
{
int ret;
for(size_t r = 0; r < rows; ++r)
{
for(size_t c = 0; c < cols; ++c)
{
printf("Enter element (%zu, %zu): ", r + 1, c + 1);
while ( (ret = scanf(format, &mat[r][c])) != 1 )
{
if (ret == EOF)
{
fputs("Error: Unexpected end of input.", stderr);
return ret;
}
puts("Please enter a valid number.");
for (int ch = getchar(); ch != EOF && ch != '\n'; ch = getchar());
}
}
}
return 0;
}
void print_matrix( const char *format, size_t rows, size_t cols, value_t mat[rows][cols] )
{
for (size_t r = 0; r < rows; ++r)
{
for (size_t c = 0; c < cols; ++c)
{
printf(format, mat[r][c]);
}
putchar('\n');
}
}
int ask_matrix_dimensions( const char *msg, int *rows, int *cols )
{
printf("Please enter the number of rows and columns of %s: ", msg);
int ret;
while ( (ret = scanf("%d%d", rows, cols)) != 2 || *rows < 1 || *cols < 1)
{
if (ret == EOF)
{
fputs("Error: Unexpected end of input.", stderr);
break;
}
puts("Please enter two positive numbers.");
for (int ch = getchar(); ch != EOF && ch != '\n'; ch = getchar());
}
return ret;
}
void multiply_matrices( size_t rows, size_t inner, size_t cols,
value_t mat_a[rows][inner], value_t mat_b[inner][cols],
value_t mult[rows][cols] )
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t j = 0; j < cols; ++j)
{
mult[i][j] = mat_a[i][0] * mat_b[0][j];
}
for (size_t k = 1; k < inner; ++k)
{
for (size_t j = 0; j < cols; ++j)
{
mult[i][j] += mat_a[i][k] * mat_b[k][j];
}
}
}
}