C error : "Subscripted value is neither array nor pointer" in row echelon form
C error : "Subscripted value is neither array nor pointer" in row echelon form
#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;
}
}
}
// 第1行减去第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;
}
}
}
// 第一行减去第三行得到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);
}
void printmatrix(float a[])
的参数不正确。
将函数原型替换为:
void printmatrix(float 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 编译器,您将不得不做一些 hackish。您可以显式传递第一个元素的地址,然后手动计算 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] );
#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;
}
}
}
// 第1行减去第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;
}
}
}
// 第一行减去第三行得到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);
}
void printmatrix(float a[])
的参数不正确。
将函数原型替换为:
void printmatrix(float 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 编译器,您将不得不做一些 hackish。您可以显式传递第一个元素的地址,然后手动计算 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] );