Ошибка C: "подписанное значение не является ни массивом, ни указателем" в форме эшелона строки
#include <stdio.h>
// Печатная матрица
void printmatrix(float a[]){
int i, j;
printf("\nOutput matrix: \n");
for(i=0; i<3; i++){
for(j=0; j<4; j++){
printf("%f ", a[i][j]);
}
printf("\n");
}
}
void main(){
int i, j, k, l, count;
float temp, value;
float a[3][4];
printf("Enter a matrix: \n");
// Получение матричного ввода от пользователя
for(i=0; i<3; i++){
for(j=0; j<4; j++){
scanf("%f", &a[i][j]);
}
}
printmatrix(a);
// Проверяет 1 во 2-й и 3-й строке и заменяет соответствующую строку 1-й строкой
for(i=0, count =0; i<3; i++){
if(a[i][0] == 1 && i != 0){
for(j=0; j<4; j++){ // swapping two rows
temp = a[i][j];
a[i][j] = a[0][j];
a[0][j] = temp;
}
break;
}
count++;
// If there is no 1 in any row then divide 1st row by a[0][0]
if(count == 3){
k = 0;
value = a[0][0];
for(j=0; j<4; j++){
a[k][j] = a[k][j]/value;
}
}
}
// Вычитаем 2-ю и 3-ю строку из 1-й строки, чтобы получить a [1] [0] = a [2] [0] = 0
for(i=1; i<3; i++){
value = a[i][0];
for(j=0; j<4; j++){
a[i][j] = a[i][j] - value * a[0][j];
}
printf("\n");
}
printmatrix(a);
// Проверяет 1 в 3-м ряду и заменяет 3-й ряд и 2-й ряд
for(i=1, count =0; i<3; i++){
if(a[i][0] == 1 && i != 1){
for(j=0; j<4; j++){ // swapping two rows
temp = a[i][j];
a[i][j] = a[0][j];
a[0][j] = temp;
}
break;
}
count++;
// If there is no 1 in any row then divide 2nd row by a[1][1]
if(count == 2){
k = 1;
value = a[1][1];
for(j=0; j<4; j++){
a[k][j] = a[k][j]/value;
}
}
}
// Вычитаем 3-ю строку из 1-й строки, чтобы получить a[2][1]=0
for(i=2; i<3; i++){
value = a[i][1];
for(j=0; j<4; j++){
a[i][j] = a[i][j] - value * a[1][j];
}
printf("\n");
}
printmatrix(a);
}
2 ответа
Вы объявили printmatrix
принять одномерный массив в качестве параметра, но вы пытаетесь индексировать этот параметр как двумерный массив. Это не сработает.
Некоторые варианты:
Поскольку вы предполагаете, что всегда работаете с матрицей 3х4, вы можете просто объявить ее в списке параметров функции:
void printmatrix( float a[3][4] )
{
...
}
Однако следует помнить, что в контексте объявления параметров функции любое объявление в форме T a[]
или же T a[N]
будет рассматриваться как T *a
; в результате вышеуказанная декларация будет интерпретирована как
void printmatrix( float (*a)[4] )
{
...
}
Редактировать - имел тип a
неправильно; вот что я получаю за публикацию без тестирования
В общем, вы не должны жестко кодировать размеры вашего массива в printmatrix
функция; Что делать, если вы хотите отобразить 2 матрицы с разными размерами? Лучшая идея - передать размеры массива в качестве отдельных аргументов.
Если вы используете компилятор C99 или компилятор C2011, который поддерживает массивы переменной длины, это легко:
void printmatrix( size_t rows, size_t cols, float (*a[rows]) )
{
size_t i, j;
printf("\nOutput matrix: \n");
for(i=0; i<rows; i++){
for(j=0; j<cols; j++){
printf("%f ", a[i][j]);
}
printf("\n");
}
и вы бы назвали это
printmatrix( 3, 4, matrix );
Если вы не используете компилятор C99 или компилятор C2011, который поддерживает массивы переменной длины, вам придется сделать что-то немного хакерское. Вы можете явно передать адрес первого элемента, а затем вручную вычислить 2D-смещение, например, так:
void printmatrix( size_t rows, size_t cols, float *a )
{
size_t i, j;
for ( i = 0; i < rows; i++ )
{
for ( j = 0; j < cols; j++ )
printf(" %f", a[i * rows + j] );
putchar( '\n' );
}
}
и вы бы назвали это
printmatrix( 3, 4, &matrix[0][0] );
Аргумент к void printmatrix(float a[])
не является правильным.
Замените прототип функции на:
void printmatrix(float a[][])