我正在编写一个程序,从.txt文件中读取数字,然后将其放入二维矩阵中,我可以使用该矩阵进行矩阵乘法运算,但在这一点上,我很难让扫描文件的代码部分正常工作。我有两个随机生成的矩阵,我正在使用,对于较小的矩阵,它将读取前400个值,但数组的其余部分将为零。对于4000x4000的较大的一个,它只会抛出一个分段错误,甚至不会进入主节点。有什么想法会导致这种情况吗?我将ARRAY_SIZE更改为数组长度和宽度的任意值。
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 4000
int main(int argc, char *argv[]) {
// Form to read: ./programname #ofthreads inputfilename1 inputefilename2 outputfilename
if(argc != 5) {
printf("Error! usage: ./programname #ofthreads inputfilename1 inputfilename2 outputfilename");
return (EXIT_FAILURE);
}
// get number of threads
int numThreads = atoi(argv[1]);
// make file pointers
FILE *fp1;
FILE *fp2;
// assign pointer to file name
fp1 = fopen(argv[2], "r");
fp2 = fopen(argv[3], "r");
// Error Handling if file doesn't exist
if (fp1 == NULL) {
printf("Error: File 1 does not exist. ");
return (EXIT_FAILURE);
}
if (fp2 == NULL) {
printf("Error: File 2 does not exist. ");
return (EXIT_FAILURE);
}
// initialize arrays
int array1[ARRAY_SIZE][ARRAY_SIZE] = {0};
int array2[ARRAY_SIZE][ARRAY_SIZE] = {0};
// initialize dimension ints
int size1[2];
int size2[2];
// Get Dimensions
fscanf(fp1,"%d ",&size1[0]);
fscanf(fp1,"%d n", &size1[1]);
fscanf(fp2,"%d ",&size2[0]);
fscanf(fp2,"%d n", &size2[1]);
int length1 = size1[0];
int width1 = size1[1];
int length2 = size2[0];
int width2 = size2[1];
for(int n = 0; n < length1; n++){
for(int m = 0; m < width1; m++){
fscanf(fp1, "%d ", &array1[m][n]);
}
}
for(int n = 0; n < length2; n++){
for(int m = 0; m < width2; m++){
fscanf(fp1, "%d ", &array2[m][n]);
}
}
// Process file here
// Close file
fclose(fp1);
fclose(fp2);
for(int n = 0; n < width1; n++){
for(int m = 0; m < length1; m++){
// printf("%d ", array1[m][n]);
}
printf("n");
}
printf("Number of threads = %dn", numThreads);
printf("Size1 = %d x %dn", size1[0],size1[1]);
printf("Size2 = %d x %dn", size2[0],size2[1]);
return 0;
}
2 x 4000 x 4000int
s很可能会占用比现有空间更多的堆栈空间。使用calloc
动态分配内存(在stdlib.h
中声明(:
// allocate space for ARRAY_SIZE elements of size int[ARRAY_SIZE] and zero the memory:
int(*array1)[ARRAY_SIZE] = calloc(ARRAY_SIZE, sizeof *array1);
int(*array2)[ARRAY_SIZE] = calloc(ARRAY_SIZE, sizeof *array2);
if(array1 == NULL || array2 == NULL) exit(1);
然而,从外观上看,在大多数情况下,您实际上并不需要所有的内存,因为您从文件中获得了length1
、width1
、length2
和width2
。在从文件中获得输入后分配数组:
if(fscanf(fp1, " %d %d", &length1, &width1) != 2 ||
fscanf(fp2, " %d %d", &length2, &width2) != 2) exit(1);
int(*array1)[width1] = calloc(length1, sizeof *array1);
int(*array2)[width2] = calloc(length2, sizeof *array2);
if(array1 == NULL || array2 == NULL) exit(1);
然后像以前一样使用array1
和array2
。
当你用完它们时,free
分配的内存:
free(array1);
free(array2);
- 进程堆栈大小有限(只有几个MIB(。它因操作系统实现的不同而有所不同。如果您需要以上内容,最好从堆中获取(内存管理调用(
int rows = 4000;
int cols = 4000;
int **array = (int**) malloc (rows * sizeof(int*));
if (!array) {
perror("malloc1");
exit(1);
}
for (ri = 0; ri < rows; ++ri) {
array[ri] = (int*) malloc (cols * sizeof(int));
if (!array[ri]) {
perror("malloc2");
exit(2);
}
}
- 记住以相反的顺序释放分配的内存。首先是列"(循环(,然后是行">
编辑:3.假设您同时分配了array1
&使用CCD_ 13调用的CCD_。
- 读取
array2
内容
fscanf(fp1, "%d ", &array2[m][n]);
那不应该是fp2
吗?
由于要进行矩阵乘法运算,因此需要验证矩阵的阶数。
用于没有CCD_ 16&而不从文件中读取数据。