Ошибка 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[][])

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