C 错误:行梯队形式"Subscripted value is neither array nor pointer"


#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);

检查第 2 行和第 3 行中的 1,并将相应的行替换为第 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 行,得到 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);
检查第 3 行

中的 1 并替换第 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 行得到 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);
}

您已声明printmatrix将一维数组作为参数,但您尝试将该参数作为二维数组编制索引。 那行不通。

一些选项:

由于您假设您始终使用 3x4 矩阵,因此您可以简单地在函数参数列表中将其声明为:

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[][])

最新更新