распечатать матрицу из файла - PullRequest
2 голосов
/ 27 марта 2011

Я использую этот код для загрузки матрицы:

 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]) =>, он успешно загружается из файла, но когда я пытаюсь распечатать его с помощью моего метода, который также печатает, я получаю 0,00 для каждого фрагмента в матрице. Почему так? Я пропускаю какую-то ссылку?

Ответы [ 4 ]

3 голосов
/ 27 марта 2011

Возможно, вам следует использовать тип double или float для матричного массива.

2 голосов
/ 27 марта 2011

У вас целочисленная матрица, поэтому вы должны использовать% d вместо% f /% .2f для сканирования / печати

1 голос
/ 27 марта 2011

Поскольку вы используете массив 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]){
...
}
1 голос
/ 27 марта 2011
float A[10][11];

но ...

void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){

A 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 требует всего, кроме первого индекса массива , который будет известен при компиляцииВремя, вы можете сделать функцию программы, объявив прототип для 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  

Я возился с другими вещами, отслеживая этот (и стандартизировал отступы вдва пробела, это ужасно мало, но непротиворечивость непоследовательности ритмов каждый раз), но я почти уверен, что единственное, что я изменил по существу, - это прототип функции, включающей измерение массива last .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...