我试图用值随机填充二维数组,然后将它们相乘,但由于某些奇怪的原因,当我运行我的代码时,在最后一次迭代中,我得到一个分段错误。我试过减少我传递它的数量和一切,但故障仍然存在。这是我正在尝试执行的代码,非常感谢任何帮助,谢谢。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *matrixFile;
int n = atoi(argv[1]); // the number of matrices
int i, j; // must declare outside of for loop due to resolve C99 mode error
double arrA[n][n];// = CreateRandomMatrix(n);
double arrB[n][n];
double sumArr[n][n];
matrixFile = fopen("home/acolwell/Documents/CPE631_HW2_Number1/results.txt", "w+");
printf("Usage: %s <size of nxn matrices>\n", argv[1]);
// randomly populate arrA and arrB
for(i = 0; i < n; i++)
{
printf("%d\n", i);
for(j = 0; j < n; j++)
{
printf("%4d", j);
arrA[i][j] = (double)rand()/(double)RAND_MAX;
arrB[i][j] = (double)rand()/(double)RAND_MAX;
}
}
printf("Exiting Matrix randomization");
// multiply the matrices and write them to the file
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
sumArr[i][j] = arrA[i][j] * arrB[i][j];
printf("Writing matrix ");
fprintf(matrixFile, "%0.3lf\n", sumArr[i][j]);
}
}
if(matrixFile)
{
fclose(matrixFile);
}
matrixFile = NULL;
return 0;
}
答案 0 :(得分:1)
此错误将归结为注销数组的末尾或无法打开文件。我建议运行gdb来检查程序运行时的程序,但是从快速浏览一下我就不知道你是不是想要有
"/home/acolwell/Documents/CPE631_HW2_Number1/results.txt"
作为要写的文件而不是
"home/acolwell/Documents/CPE631_HW2_Number1/results.txt"
我建议在调用fprintf之前检查你的fopen调用的结果。
答案 1 :(得分:1)
如果n
足够大,您将使用VLA
生成堆栈溢出。我已经通过实验验证了您的代码(例如,使用5000的n
)。
因此,您需要使用malloc
从堆中分配。但是,这需要进行一些重写。
这是一种使用堆分配和的方法,可以获得VLA
[使用一些轻微的欺骗]的好处:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define C(_arr) (double (*)[(size_t)(n)]) _arr
void
docalc(FILE *fout,int n,double arrA[n][n],double arrB[n][n],double sumArr[n][n])
{
// must declare outside of for loop due to resolve C99 mode error
int i,
j;
// randomly populate arrA and arrB
for (i = 0; i < n; i++) {
printf("%d\n", i);
for (j = 0; j < n; j++) {
printf("%4d", j);
arrA[i][j] = (double) rand() / (double) RAND_MAX;
arrB[i][j] = (double) rand() / (double) RAND_MAX;
}
}
printf("Exiting Matrix randomization");
// multiply the matrices and write them to the file
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sumArr[i][j] = arrA[i][j] * arrB[i][j];
printf("Writing matrix\n");
fprintf(fout, "%0.3lf\n", sumArr[i][j]);
}
}
}
int
main(int argc, char *argv[])
{
FILE *matrixFile;
int n = atoi(argv[1]); // the number of matrices
printf("Usage: %s <size of nxn matrices>\n", argv[1]);
matrixFile = fopen("/tmp/results.txt", "w+");
if (matrixFile == NULL) {
perror("fopen");
exit(1);
}
double *arrA = malloc(sizeof(double) * n * n);
double *arrB = malloc(sizeof(double) * n * n);
double *sumArr = malloc(sizeof(double) * n * n);
docalc(matrixFile,n,C(arrA),C(arrB),C(sumArr));
if (matrixFile)
fclose(matrixFile);
matrixFile = NULL;
return 0;
}
答案 2 :(得分:0)
我刚编译并测试了您的代码。您提供的文件名不正确;你需要一个&#34; /&#34;在&#34; home&#34;。
之前不确定要求是什么,但是将矩阵文件写成矩阵:在矩阵的每一行之后添加一个新行&#34;乘以&#34;,而不是在每个元素之后:
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
sumArr[i][j] = arrA[i][j] * arrB[i][j];
printf("Writing matrix ");
fprintf(matrixFile, "%0.3lf ", sumArr[i][j]);
}
fprintf(matrixFile, "\n");
}
另外,请认真对待Craig Easley的评论。堆栈溢出可能发生,即使在本网站的前提下也是如此;)考虑在堆上动态分配矩阵。