2015-06-26 4 views
1

Я написал программу, которая работает для большинства входных данных, но если я попрошу, чтобы она делала повышение точности с использованием большего массива (около 320x320 было, когда я начинал видеть проблемы), он сбой. Я искал свою проблему онлайн и нашел this similar problem и this tutorial о том, что с этим делать. Проблемная часть моего исходного кода ниже - у меня была точность = 320 и holepop = 770.Ошибка при попытке использовать кучу

double spacing = 2.0/(precision+1); 
int lattice_int[precision][precision]; 
for (i=0; i<precision; ++i){ 
    for (ii=0; ii<precision; ++ii){ 
     mindist_sq = 2.0; 
     lattice_int[i][ii] = 0; 
     for (iii=0; iii<holepop; ++iii){ 
      xdist = abs(xcoord[iii] + 1.0 - spacing/2 - spacing*i); 
      ydist = abs(ycoord[iii] - 1.0 + spacing/2 + spacing*ii); 
      thisdist_sq = xdist*xdist+ydist*ydist; 
      if (thisdist_sq < mindist_sq){ 
       lattice_int[i][ii] = dint[iii]; 
       mindist_sq = thisdist_sq; 
      } 
     } 
    } 
} 

Я попытался это исправить с этим изменением в первых двух строках:

int * lattice_int; 
double spacing = 2.0/(precision+1); 
lattice_int = new int[precision][precision]; 

(я поставил в "удалить lattice_int [] [];" в конце.) Тем не менее, я получил эту ошибку: «точность» не может возникать в постоянном выражении Это потому, что я пытаюсь работать с несколькими индексами? Что я могу сделать, чтобы обойти мою проблему? Спасибо!

+0

'int lattice_int [precision] [precision];' требует 'precision' быть константой времени компиляции. Если вы используете 'new', это не так. Не имеет ничего общего с «несколькими индексами». несколько измерений. Edit: вы бы сделали 'new int [точность * точность];' для 'новой' версии, вместо' new int [precision] [precision]; 'как заметил @Puppy. Во всяком случае, придерживайтесь 'std :: vector', намного лучше. – nwp

+0

Вы ошибаетесь. Если вы используете 'new []', то только первое измерение может быть непостоянным. – Puppy

ответ

3

Не используйте new[], это будет только причинить вам боль, страдание, утечка памяти, использование после FreeS и т.д.

Вы можете использовать std::vector в этом отношении.

std::vector<std::vector<int>> lattice_int(precision, std::vector<int>(precision)); 

Нет памяти освобождение необходимо.

+0

Спасибо! Мне нужно изучить разницу между векторами и массивами, чтобы я знал, как с ними работать. Честно говоря, весь мой опыт программирования является самоучкой и поэтому имеет большие пробелы. – BGreen

+0

@BGreen: Массивы - это дерьмо. Векторы нет. Это в значительной степени главное отличие. – Puppy

0

Ваша переменная lattice_int является 2-мерным массивом. Вы можете выделить его с помощью следующего кода:

int precision = 500; 
int ** lattice_int; 
double spacing = 2.0/(precision+1); 

lattice_int = new int*[precision]; 
for (int i = 0; i < precision; i++) 
{ 
    lattice_int[i] = new int[precision]; 
} 

Точно так же вы должны итерацию для удаления каждого подраздела массива.

Примечание: Это чистая иллюстрация для использования указателей для создания двухмерного массива. Лучше было бы использовать вектор для этого.

+0

Спасибо! Я благодарен за то, что вы объяснили, как это сделать с помощью новых [] и указателей, а просто для того, чтобы показать, как это сделать, подумав немного о коробке. – BGreen

+0

@BGreen: В коробке есть очень важная причина. Это потому что, если вы стоите вне его, вы окажетесь на наземной мине. Или сто. И тогда ваша заявка будет ненадежной багги. – Puppy

+0

С другой стороны, если я никогда не покину коробку, я все равно буду «Hello World». Там есть тонкая грань между попытками новых вещей и попыткой использовать то, что вы не понимаете. Я понимаю, что вы говорите, что не используете инструменты таким образом, чтобы они не были пригодны для использования. Я просто пытался выразить некоторую признательность за другую перспективу, даже если это было на практике плохой идеей. – BGreen

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