读取维数未知的矩阵

时间:2019-05-29 16:10:59

标签: c

我正在尝试从以这种方式格式化的文件中读取矩阵

1 2 3 4
4 5 6 7
8 9 10 11
*
1 0 1
0 1 1
1 1 1]

但是我不知道如何将多维数据集数组的维数由rows []和cols []数组传递给函数read_matrix()。

我能够得到两个矩阵的正确维数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int get_dim(char *file, int *r, int *col);
/*gets the dimension and type of operation*/

void read_matrix(char *file, int (*matA)[], int(*matB)[], int *m, int *n);

int main (int argc, char *argv[]){

    int i,j;
    int rows[2]= {0,1}; /* The last line of the file does not contain '\n' */
    int cols[2]= {0,0};
    int operation; /*type of operation 1 for * and 2 for + */

    operation = get_dim(argv[1], rows, cols);

    int A[rows[0]][cols[0]];
    int B[rows[1]][cols[1]];

    printf("A is a matrix %d x %d\n",rows[0], cols[0]);

    if(operation != 0)
        printf("B is a matrix %d x %d\n", rows[1], cols[1]);

    read_matrix(argv[1], A, B, rows, cols);

    /*printing the matrices */

    for(i = 0; i < rows[0]; i++){
        for(j=0; j < cols[0]; j++){
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }

    printf("*\n");

     for(i = 0; i < rows[1]; i++){
        for(j=0; j< cols[1]; j++){
            printf("%2d ", B[i][j]);
        }
        printf("\n");
    }    
    return 0;
}

int get_dim(char *file, int *r, int *col){

   FILE *fp; 
   int c;
   int op=0;
   int n =0; /*to check all coefficients in a row */

   /* opening file for reading */
   fp = fopen(file, "r");

   if(fp == NULL) {
      perror("Error opening file");
   }

   while ( (c = getc(fp)) != ']')
   {       
       if(isdigit(c) && n==0){
           if(op == 0)
               col[0]++;
           else
               col[1]++;
       }        

    //Count whenever new line is encountered
    if (c == '\n'){
        n=1;
        if(op == 0)
            r[0]++;
        else 
            r[1]++;
    }     

        if(c == '*'){
            op=1;
            n =0;
            c = getc(fp);
        }
        else if(c == '+'){
            op=2;
            c = getc(fp);
        }

        //take next character from file.
    }
    fclose(fp);
    return op;
}

void read_matrix(char *file, int (*matA)[], int(*matB)[], int *m, int *n){

    int i,j;
    FILE *fp;

    if( (fp = fopen(file, "r")) != NULL ){

        for(i=0; i < m[0]; i++)
            for(j=0; j < n[0]; j++)
                fscanf(fp, "%d", &matA[i][j]);    

        /*skip the line containing the character operator */
        while ( fgetc(fp) != '\n')
            fgetc(fp);        

        for(i=0; i < m[1]; i++)
            for(j=0; j < n[1]; j++)
                fscanf(fp, "%d", &matB[i][j]);    
    }

    fclose(fp);
}

我应该这样定义指针:int(* matA)[cols [0]]和int(* matB)[cols [1]]。 在read_matrix()中,通过声明以下指针:int(* matB)[]我得到了错误:据我所知,无效使用了未指定边界的数组。但是界限是由get_dim()函数确定的。

2 个答案:

答案 0 :(得分:0)

get_dim函数的结果是在运行时确定的,并且像matA这样的静态数组的大小必须在编译时确定。例如,使用以下代码:

volatile size_t length = 5;
int myArray[length];

或者另一个例子:

size_t length;
//take input from the user...
int myArray[length]

这些示例无法编译,因为只能在运行时确定长度。

您必须使用动态分配的数组来完成您想做的事情。

答案 1 :(得分:0)

您可以通过变量给出参数中的列数,例如:

#include <stdio.h>

int f(int n, int (*a)[n])
{
  return a[1][2];
}

int main()
{
  int nr, nc;

  if (scanf("%d %d", &nr, &nc) == 2) {
    int a[nr][nc];

    for (int i = 0; i != nr; i++)
      for (int j = 0; j != nc; ++j)
        a[i][j] = i*10+j;

    printf("%d\n", f(nc, a));
  }

  return 0;
}

编译和执行:

bruno@bruno-XPS-8300:/tmp$ gcc -pedantic -Wall -Wextra a.c
bruno@bruno-XPS-8300:/tmp$ ./a.out
5 3
12
bruno@bruno-XPS-8300:/tmp$ 

这将按预期打印12,因此单元格地址的计算是正确的。

因此调用read_matrix直接在参数中(而不是通过指针)给出每个矩阵的列数指向每个矩阵的指针之前


P.S。再次为我的错误感到抱歉,因为您的问题像是虚假的重复一样开始,而且我不记得我只是得到了这个老问题中的内容,我挑起了错误的重复内容