我正在尝试从以这种方式格式化的文件中读取矩阵
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()函数确定的。
答案 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。再次为我的错误感到抱歉,因为您的问题像是虚假的重复一样开始,而且我不记得我只是得到了这个老问题中的内容,我挑起了错误的重复内容