Release vs Debug version: внезапная ошибка во время выполнения - PullRequest
0 голосов
/ 15 марта 2020

У меня есть программа, которая выполняет БПФ на 2d массиве. Чтобы работать с библиотекой fft fftw3, я должен использовать временный массив (называемый FTtemp), который считывает результат FFT: это 3d, поскольку он содержит ось x & y плюс действительное и мнимое значение для каждого (x у) тупель.

Передача данных из массива FFT (который имеет специальный тип переменной) в обычный массив работает в режиме отладки, но не в выпуске. В выпуске я получаю следующую ошибку времени выполнения: Место записи нарушения прав доступа 0x02913000.

Из моего поиска в Google я обнаружил, что ошибки в версии выпуска обычно связаны с неинициализированными объектами. Это привело меня к явной инициализации каждого элемента в FTtemp с 0.0, но безрезультатно. Кроме того, я распечатал элементы массива FFt на консоли и появились числа, что означает, что они также инициализированы. Следовательно, я немного не в себе и думаю, что кто-то может быть мудрее меня?

Вот фрагмент кода, о котором я говорю. Поскольку программа опирается на множество других вещей, я пока не смог воссоздать минимальный пример, но добавлю его, как только получу ту же ошибку.

Забавный факт: я печатаю & j значения l oop для консоли при устранении неисправностей, и это еще один (I, j) узел, в котором он падает каждый раз, когда я его запускаю: например: 49,212 или 116,169. Я действительно смущен этим.

        FTtemp = new double** [width];
        for (i = 0; i < width; i++) {
            FTtemp[i] = new double*[height];
        }
        for ( i = 0; i < width; i++)
        {
            for (j = 0; j < height; j++) {
                FTtemp[i][j] = new double[2]; 
                FTtemp[i][j][0] = 0.0;
                FTtemp[i][j][1] = 0.0;
            }
        }

        cout << "width,height: " << width << "," << height << endl;
        for (i = 0; i < width; i++)
        {
            for (j = 0; j < height; j++) {
                /*
                cout << "access to out: " << out[indexFFT(i, j)][0] << endl;
                cout << "access to FTtemp: " << FTtemp[i][j][1] << endl;
                */
                cout << "i,j is: " << i << "," << j << endl;
                FTtemp[i][j][1] = out[indexFFT(i, j)][0]; <--------- error occours here
                FTtemp[i][j][2] = out[indexFFT(i, j)][1];
            }
        }

Спасибо за внимание. Всего наилучшего, Синий

1 Ответ

1 голос
/ 15 марта 2020

В этой строке есть ошибка:

FTtemp[i][j][2] = out[indexFFT(i, j)][1];

Обратите внимание, что FTtemp[i][j] инициализируется ранее в вашем коде new double[2], что означает, что FTtemp[i][j][2] является записью вне пределов. .

Здесь могут быть другие проблемы - возможно, indexFFT(i, j) дает неверный индекс? - но не видя, как out был инициализирован или как indexFFT работает, мы не можем быть уверены.

Надеюсь, это поможет!

...