2015-01-11 2 views
2

Я работаю над программой на C++, которая должна передавать 2D-изображение интенсивности пламени в 3D-модель. Программа в основном работает с несколькими матричными операциями, которые я все понял с помощью указателей (я знаю, я мог бы использовать векторы, хотя). После ввода текстового файла, зеркалирования и сглаживания значений данных, происходит расчет коррекции для каждой строки изображения. В начале функции для этого вычисления программа останавливается в произвольной позиции, но в for-loop объявляет вектор y_values.Программа C++ останавливается без причины в случайной позиции

Вот код-фрагмент:

void CorrectionCalculation(Matrix Matrix_To_Calculate, int n_values, int polynomial_degree, int n_rows) 
{ 
    for (int h = 0; h < n_rows; h++) 
    { 
     //Initialising and declaration of the y_values-vector, which is the copy of each matrix-line. This line is used for the correction-calculation. 
     double* y_values = new double(n_values); 
     for (int i = 0; i < n_values; i++) 
     { 
      y_values[i] = Matrix_To_Calculate[h][i]; 
     } 

     //Initialisiing and declaration of the x-values (from 0 to Spiegelachse with stepwidth 1, because of the single Pixels) 
     double* x_values = new double(n_values); 
     for (int i = 0; i < n_values; i++) 
     { 
      x_values[i] = i; 
     } 

При расчете единой строки, программа работала нормально. Но когда я добавил код для вычисления всего изображения, программа останавливается.

+0

'double * y_values ​​= new double (n_values);' Это не будет создавать массив, а единственный двойной элемент. Как программа ведет себя после этой коррекции (есть две из них)? – lared

+1

«Без причины». Да, ваша программа идеальна, каковы были дизайнеры C++. – Blindy

+0

Вы правы, я должен был написать «без очевидной причины (для меня и в данный момент)». Инициализация y_values ​​и x_values ​​была единственным случаем, когда я забыл использовать [] вместо(). Довольно раздражать, чтобы не понять, что неудача, но, похоже, я стоял на трубе. –

ответ

2

Вы не выделяете массив значений, а один элемент. Вместо:

double* y_values = new double(n_values); 
// ... 
double* x_values = new double(n_values); 

Изменить его

double* y_values = new double[n_values]; 
//... 
double* x_values = new double[n_values]; 

Вы должны использовать vector двойников, а не массив новой. Таким образом, память будет автоматически удалена, когда она больше не понадобится. Например .:

#include <vector> 
std::vector<double> y_values(y_values); 

Вы также hiding variables с помощью имен переменных такой же, как параметры. Это может привести к путанице и тонким ошибкам в коде, где вы не совсем уверены, какая переменная изменяется.

+0

похоже, что это была ошибка для программы, которая перестает работать в этом положении .... довольно раздражает;). Большое спасибо. Мне также пришлось написать этот формат для инициализации x_values. Тем не менее он все еще останавливается ... пытаясь выставить ошибку сейчас. –

+1

«рассмотреть возможность использования вектора», безусловно, недостаточно силен. Если вы не опытны и не знаете, что делаете, нет смысла использовать новый массив. Я не помню, чтобы законно использовать его в течение десяти лет программирования на С ++. –

+0

Хорошо, я буду использовать векторы. Я просто использовал массивы, потому что мы думали сделать это - я думаю, что в основном это было из-за понимания C++. Спасибо за поддержку. –

Смежные вопросы