在C中增加自动数组大小后出现编译器错误
我试图计算18456个基因的相关性度量,但将宏在C中增加自动数组大小后出现编译器错误,c,macros,C,Macros,我试图计算18456个基因的相关性度量,但将宏GENE或INDEX增加到4000到5000或更大的值后,编译器(Dev C)退出。例如,它可以很好地用于: # define GENE 4000 # define INDEX 3000 但不包括: #define GENE 5000 #define INDEX 100 输入文件是一个以空格分隔的文本文件,共有18456行57列。 代码如下: #include <stdio.h> #include <stdlib.h>
GENE
或INDEX
增加到4000到5000或更大的值后,编译器(Dev C)退出。例如,它可以很好地用于:
# define GENE 4000
# define INDEX 3000
但不包括:
#define GENE 5000
#define INDEX 100
输入文件是一个以空格分隔的文本文件,共有18456行57列。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <limits.h>
#define GENE 5000
#define N 57
#define INDEX 1000
int main (void) {
clock_t start, stop;
double t = 0.0;
int i, j, p, q, wp, wq;
double x;
double *S_matrix = (double *)malloc(INDEX * GENE * sizeof(double));
double sum_S, S_max;
double S[11] = {0};
double r = 0.0, xbar = 0.0, ybar = 0.0, sx = 0.0, sy = 0.0;
// read E matrix
FILE *fq;
double E[GENE][N] = {{0}};
if ((fq = fopen("E_disease.txt", "r")) == NULL )
{
printf("Error\n");
exit(EXIT_FAILURE);
}
fq = fopen("E_disease.txt","r");
printf("\n");
for (i=0;i<GENE;i++)
{
for(j=0;j<N;j++)
{
fscanf(fq,"%lf",&x);
E[i][j] = x;
}
}
printf("\n");
fclose(fq);
// calculate correlation
assert((start = clock())!=-1);
for(p=0; p < INDEX; p++)
{
for(q=0; q < GENE; q++)
{
for(i=0; i<11; i++)
{
/*compute xbar */
for(j = i; j < N; j++)
{
xbar += E[p][j];
}
xbar /= N;
/*compute ybar*/
for(j = i; j < N; j++)
{
ybar += E[q][j];
}
ybar /= N;
/* compute standard deviation of x*/
for(j = i; j < N; j++)
{
sx += (E[p][j] - xbar) * (E[p][j] - xbar);
}
sx = sqrt(sx);
/* compute standard deviation of y */
for(j = i; j < N; j++)
{
sy += (E[q][j] - ybar) * (E[q][j] - ybar);
}
sy = sqrt(sy);
/*compute r, the correlation coefficient between the two arrays */
for( j = i; j < N; j++ )
{
r += (((E[p][j] - xbar)/sx) * ((E[q][j] - ybar)/sy));
}
r /= (N);
if(r>0)
{
S[i] = r;
}
else if(r<=0)
{
S[i] = 0;
}
}
for(j=0, sum_S=0; j<11; j++)
{
sum_S += S[j];
}
for(j=0, S_max = 0; j<11; j++)
{
if(S[j] > S_max)
{
S_max = S[j];
}
}
S_matrix[p*GENE + q] = sum_S/(11*S_max);
}
}
FILE * fs;
fs = fopen ("s_matrix.txt", "w+");
for(wp=0; wp<INDEX; ++wp)
{
for(wq=0; wq<GENE; ++wq)
{
fprintf(fs, "%lf", S_matrix[wp*GENE + wq]);
fprintf(fs, "\t");
}
fprintf(fs, "\n");
printf("\n");
}
fclose(fs);
stop = clock();
t = (double) (stop-start)/CLOCKS_PER_SEC;
printf("Run time: %f\n", t);
//print results
//return (0);
getchar();
}
由于固定数组声明过大,您试图在
main()
中保留2280000字节的堆栈空间(实际上更多)。具体而言,这一行:
double E[GENE][N] = {{0}};
等同于
double E[5000][57] = {{0}};
以每双字节8字节的速度,很可能会耗尽堆栈。改为对该数组使用动态分配。例如:
double (*E)[N] = malloc(5000*sizeof(*E));
完成后别忘了释放它
全局固定分配也将起作用(即,将其声明为main()
功能块外部的全局分配)
static double E[GENE][N];
int main()
{
... your code ...
}
您选择的任何方法都有潜在的优点和缺点,因此请进行相应的计划。由于固定数组声明过大,您试图在
main()
中保留2280000字节的堆栈空间(实际上更多)。具体来说,这一行:
double E[GENE][N] = {{0}};
等同于
double E[5000][57] = {{0}};
以每双字节8字节的速度,很可能会耗尽堆栈。请改为使用该数组的动态分配。例如:
double (*E)[N] = malloc(5000*sizeof(*E));
完成后别忘了释放它
全局固定分配也将起作用(即,将其声明为main()
功能块外部的全局分配)
static double E[GENE][N];
int main()
{
... your code ...
}
你选择的任何方法都有潜在的优点和缺点,所以要有相应的计划。在尝试分配内存时失败了吗?请描述它是如何工作的。编译时失败?运行时崩溃?有错误消息吗?@abelenky这是运行时崩溃。@WhozCraig,我想我说得太早了。我正在将
S_矩阵
写入文件为1000x18456矩阵。当E
是静态的时,它工作得很好,但在每一步中运行时间都在增加,并在第12轮中再次开始退出。在尝试分配内存时它失败了吗?描述它是如何工作的。编译时失败?运行时崩溃?有错误消息吗?@abelenky这是运行时崩溃。@WhozCraig顺便说一句,我想我说得太早了。我正在将S_matrix
作为1000x18456矩阵写入文件中。当E
是静态的时,它工作得很好,但每一步的运行时间都在增加,并在第12轮时再次开始退出。一般来说,分配给程序的堆和堆栈空间的限制是什么?@Kunal完全依赖于实现。没有覆盖所有平台的明确答案。因此,如果我有一个需要相当大的阵列的跨平台应用程序,动态分配是更安全的方法?@Kunal,而不是冒堆栈过度扩展的风险?是的。显然,它们的管理更繁琐。非常感谢Craig!你懂吗Kunal对我的论文进行了编辑。一般来说,分配给程序的堆和堆栈空间有什么限制?它完全依赖于实现。没有涵盖所有平台的明确答案。因此,如果我有一个需要相当大的阵列的跨平台应用程序,动态分配是更安全的方法?@Kunal冒着堆积如山的风险?是的。显然,管理它们更繁琐。非常感谢克雷格!你救了我的论文。