БлогNot. Если stack overflow...

Если 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 [9967 просмотров]


теги: программирование c++ builder

К этой статье пока нет комментариев, Ваш будет первым