我使用此代码加载矩阵:
FILE *inputMatrix=fopen("file","r");
fscanf(inputMatrix,"%d",&num);
for(i=0;i<num;++i){
for(j=0;j<num+1;++j){
fscanf(inputMatrix,"%f",&A[i][j]);
}
}
fclose(inputMatrix);
int numRow=num;
int numColumn=num+1;
然后我想通过方法printMatrix打印它:
void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){
int i = 0, j = 0;
printf("nc: %i, nr: %i\n",numColumn,numRow);
for(i = 0 ; i < numRow ; i++)
{
for(j = 0 ; j < numColumn ; j++)
{
printf("%.2f ", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
这是一个问题。当我在main中使用时:printf("matrix[1][1] is %f",matrix[1][1])
=&gt;它是从文件中成功加载的,但是当我尝试通过我的方法打印它时,也打印出来,我在矩阵中得到0.00。为什么这样?我错过了一些推荐吗?
答案 0 :(得分:3)
您可以使用double
或float
类型作为矩阵数组。
答案 1 :(得分:2)
你有一个整数矩阵,因此你应该使用%d而不是%f /%.2f进行扫描/打印
答案 2 :(得分:1)
float A[10][11];
但是...
void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){
float
定义,但该方法需要int
数组。我对此编译感到惊讶,但是gcc
抛出了足够的警告,应该暂停一下:
$ gcc -o 5448492 5448492.c
5448492.c:30: warning: conflicting types for ‘printMatrix’
5448492.c:24: note: previous implicit declaration of ‘printMatrix’ was here
5448492.c: In function ‘printMatrix’:
5448492.c:37: warning: format ‘%.2f’ expects type ‘double’, but argument 2 has type ‘int’
因为C需要在编译时知道除第一个数组索引以外的所有>>,所以可以通过声明包含 last <的printMatrix()
的原型来使程序功能正常运行/ em>数组索引大小。 (我在评论中说错了。抱歉。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printMatrix(int numColumn, int numRow ,float matrix[][11]);
int main (int argc,char *argv[]) {
int num;
int i,j;
float A[10][11];
FILE *inputMatrix=fopen("yourfile.in","r");
fscanf(inputMatrix,"%d",&num);
int numRow=num;
int numColumn=num+1;
for(i=0;i<numRow;++i){
for(j=0;j<numColumn;++j){
fscanf(inputMatrix,"%f",&A[i][j]);
}
}
fclose(inputMatrix);
printMatrix(numColumn,numRow,A);
return 0;
}
void printMatrix(int numColumn, int numRow ,float matrix[][11]){
int i = 0, j = 0;
printf("nc: %i, nr: %i\n",numColumn,numRow);
for(i = 0 ; i < numRow ; i++)
{
for(j = 0 ; j < numColumn ; j++)
{
printf("%f ", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
输出:
$ ./5448492
nc: 3, nr: 2
1.000000 1.000000 3.000000
2.000000 2.000000 5.000000
我在跟踪这个东西时摆弄了其他的东西(并且在两个空格处标准化了缩进;它非常小,但每次都非常喜欢的节拍不一致),但我很确定我唯一改变了实体是包含最后数组维度的函数的原型。
答案 3 :(得分:1)
如果你使用数组10x11,11
也应该在其他地方进行硬编码。传递像这样的多维数组时,除最高级别之外的所有维度都必须进行硬编码。否则,您将得到错误的结果。
原因是你的函数认为数组有numColumn
列,但内存中的数组实际上有11列。
我会做出这些改变:
include ...
...
-- note the *float** and the **[11]**
void printMatrix(int numColumn, int numRow ,float matrix[][11]);
int main (int argc,char *argv[]) {
int num;
int i,j;
float A[10][11];
...
}
-- note the *float** and the **[11]**
void printMatrix(int numColumn, int numRow ,float matrix[][11]){
...
}