QT 2d список вызывает segfault - PullRequest
2 голосов
/ 10 марта 2010

У меня есть программа, которая работала до недавнего времени. Оскорбительный код показан здесь:

void writeTimeInfo(fitsfile *fptr, QList<QList<double> > &in)
{
 double data[in.size() * in[0].size()];
 long naxes[2];
 int status = 0;

 naxes[1] = in.size();
 naxes[0] = in[0].size();

 for (int i=0; i<naxes[1]; i++)
 {
  for (int j=0; j<naxes[0]; j++)
  {
   data[j+i*naxes[0]] = in[i][j];
  }
 }


 fits_insert_img(fptr, DOUBLE_IMG, 2, naxes, &status);
 fits_write_key(fptr, TSTRING, "EXTNAME", (void*)"HJD", "Extension name", &status);
 fits_write_2d_dbl(fptr, 0, naxes[0], naxes[0], naxes[1], data, &status);

 if (status)
  fits_report_error(stderr, status);
}   

Специфика программы не важна (все подходит, она используется для манипуляции со стандартными файлами астрономии), но в настоящее время программа имеет ошибки в строке

naxis[1] = in.size();

Я не вижу, что не так - перед этим шагом я могу использовать gdb для просмотра in.size () и in [0] .size () * двух измерений массива), и я проверил значения массива. Это просто segfaults здесь.

in - это двумерный массив QList, как вы можете видеть из списка аргументов функции. Массив передается по ссылке, чтобы не дублировать память. Единственное изменение, которое я сделал, - это запуск программы на большем входном множестве, чем раньше (рабочая стадия): в 2-х элементном двойном массиве из 515 * 1508 элементов, тогда как теперь это массив из 515 * 2480 элементов. Может быть, в стеке недостаточно памяти?

Приветствия

1 Ответ

1 голос
/ 10 марта 2010

Массив 515 *1508* 1001 * составляет примерно 6 МБ - много для стека. Это, вероятно, переполнение стека. Попробуйте установить ограничение стека с помощью опции --stack от ld до ~ 10 МБ (если возможно) и протестируйте со значением 515 * 2480.

В Windows, используя бета-версию VS2010, стек завершает следующее:

int main() { double x[ 515 * 1508 ]; }

Создать массив в куче. Используйте scoped_array, если вы можете использовать Boost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...