所以我的任务是编写一个程序,它将50到3000之间的随机矩阵相乘,我遇到了麻烦。我不确定在脚本运行时更改大小的最佳方法。我可以手动完成,但这需要几个小时坐在电脑前,我觉得有一种简单的方法,我错过了。我知道如果我在main中定义这些矩阵,超过800的任何东西都会导致众所周知的堆栈溢出,这就是我将它们放在main之外的原因。不幸的是,现在我不能简单地将N作为argv [1]。我的问题是:是否有可能按照以下方式编写脚本:
./matrix 50
./matrix 150
./matrix 200
等等 如果是的话,怎么样?
#include <foo>
#define N 1000
int A[N][N];
int B[N][N];
int result[N][N];
int main(int argc, char *argv[]){
//so on
提前感谢所有回复的人。
答案 0 :(得分:0)
如果维度n
作为参数传递给程序,则
malloc
/ calloc
是个不错的选择。我会做这样的事情:
int **matrix_create(size_t dim)
{
int **matrix = calloc(dim, sizeof *matrix);
if(matrix == NULL)
return NULL;
for(size_t i = 0; i < dim; ++i)
{
matrix[i] = calloc(dim, sizeof *matrix[i]);
if(matrix[i] == NULL)
{
matrix_free(matrix, dim);
return NULL;
}
}
return matrix;
}
void matrix_free(int **matrix, size_t dim)
{
if(matrix == NULL)
return;
for(size_t i = 0; i < dim; ++i)
free(matrix[i]);
free(matrix);
}
然后你可以像main
那样创建矩阵:
int main(int argc, char **argv)
{
if(argc < 2)
{
fprintf(stderr, "usage: %s dim\n", argv[0]);
return 1;
}
// just an example of how to convert,
// you could also use strtol
size_t dim = atoi(argv[i]);
int **matrix_a = matrix_create(dim);
if(matrix_a == NULL)
return 1;
int **matrix_b = matrix_create(dim);
if(matrix_b == NULL)
{
matrix_free(matrix_a);
return 1;
}
do_something_with(matrix_a, matrix_b, dim);
matrix_free(matrix_a);
matrix_free(matrix_b);
return 0;
}
请注意,我使用的是calloc
而非malloc
,因为calloc
具有优势
将0设置为已分配的内存。它非常适合初始化和错误
处理,因为允许free(NULL)
,所以在分配内存时会看到
对于matrix[i]
行,如果出现问题,我可以放心使用
matrix_free
整个矩阵。