печать матрицы из файла
Я использую этот код для загрузки матрицы:
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;
А затем я хочу распечатать его в main методом printMatrix:
void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){
int i = 0, j = 0;
printf("nc: %i, nr: %in",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])
=> он успешно загружается из файла,но когда я пытаюсь распечатать его своим методом, который также печатает, я получаю 0.00 за каждый кусок в матрице. - Почему же? Я что, пропустил какую-то ссылку?
4 ответа:
float A[10][11];
Но...
void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){
Определение
float
, но метод ожидает массивint
. Я ошарашен этим компилированным, ноgcc
скинул достаточно предупреждений, которые должны дать одну паузу:Поскольку C требует, чтобы во время компиляции были известны все индексы массива , кроме первого индекса массива, можно сделать функцию программы, объявив прототип для$ 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’
printMatrix()
, который включает в себя размер индекса массива last. (Я ошибся в своем комментарии. Извиняюсь.)#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
Я возился с другими вещами, отслеживая этот (и стандартизировал отступы в двух пространствах; это ужасно мало, но согласованность на нелюбимом бьет непоследовательность каждый раз), но я почти уверен, что единственное, что я изменил по существу, был прототип функции, чтобы включить последнее измерение массива.
У вас есть целочисленная матрица, поэтому вы должны использовать %d вместо %f / %.2f для сканирования / печати
Поскольку вы используете массив 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]){ ... }