Если stack overflow...
Спрашивал коллега - математическая консольная программка завершалась с Runtime-ошибкой "Stack overflow"... ситуация в коде типовая для "science soft" -
#define N 500
с последующей передачей большого массива как параметра:
void Func(double Data[N][N]);
Конкретно эту ситуацию разрешить просто, например, в C++ Builder - Project, Options, вкладка Linker, увеличиваем значение Max stack size, скажем, с 0x00100000 до 0x01000000 :)
Лучший путь - работать таки с параметрами функций-указателями, а не массивами.
Потенциальная проблема - если double f[N]
заменится на double *f
легко и везде, то с
double **d
вместо double d[N][N]
в ряде компиляторов могут возникнуть проблемы... конечно, имеет смысл подумать о замене d[i][j]
на d[i*m+j]
или об альтернативном, пусть и более медленном классе (или структуре) динамических вещественных матриц, в простейшем случае так:
typedef struct { int n,m; double **Data; } MATR; void init (MATR *x,int n, int m) { x->n=n; x->m=m; x->Data=(double **)malloc(x->n*sizeof(double *)); for (int i=0; i<x->n; i++) { x->Data[i]=(double *)malloc(x->m*sizeof(double)); for (int j=0; j<x->m; j++) x->Data[i][j]=0; } } //... MATR u; init (&u,3,3);
Следует учесть, что в устаревших версиях "Билдера" могут быть встроенные ограничения на максимальный размер stack и heap, соответственно, на максимально возможные объёмы оперативки, с которой работает приложение. Например, в C++ Builder 6 это всего-навсего по 16 Мб на стек и "кучу".
Наконец, старайтесь описывать большие массивы глобально, а не внутри какой–либо функции, в том числе и main
. Тогда они попадут в "кучу", а не в стек. Ну или выделяйте динамическую память в куче оператором new. Только не огромные статические массивы в роли аргументов функций :-)
10.09.2013, 17:52 [10054 просмотра]