Вектор push_back в циклах while и for возвращает сигнал SIGABRT (сигнал 6) (C ++) - PullRequest
2 голосов
/ 03 мая 2011

Я делаю игру на C ++, которая требует от меня инициализации 36 чисел в вектор. Вы не можете инициализировать вектор списком инициализаторов, поэтому я создал цикл while, чтобы быстрее его инициализировать. Я хочу, чтобы он возвращал 4 каждого числа от 2 до 10, поэтому я использую int с именем четвертого, чтобы проверить, является ли число цикла кратным 4. Если это так, он меняет число, возвращаемое на следующий номер вверх. Когда я запускаю его, я получаю SIGABRT. Должно быть, проблема с четвертым, потому что, когда я вынул его, он не дал сигнал. Вот программа:

for (int i; i < 36;) {
    int fourth = 0;
    fourth++;
    fourth%=4;
    vec.push_back(i);
    if (fourth == 0) {
        i++;
    }
}

Пожалуйста, помогите!

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Вы не инициализируете i. Используйте for (int i = 0; i<36;). Кроме того, новая переменная forth выделяется на каждой итерации тела цикла. Таким образом, тест fourth==0 всегда будет давать false.

Я хочу сделать так, чтобы 4 от каждого числа возвращалось от 2 до 10

Я бы использовал самый прямой подход:

for (int value = 2; value <= 10; ++value)
{
  for (int count = 0; count < 4; ++count)
  {
    vec.push_back(value);
  }
}

Единственная оптимизация, которую я бы сделал, - это убедиться, что емкость вектора достаточна перед входом в цикл. Я бы оставил другие оптимизации для компилятора. Я предполагаю, что то, что вы получаете, пропуская внутренний цикл, вы проигрываете частым делением по модулю.

1 голос
/ 03 мая 2011

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

Я думаю, что это должно работать:

int fourth = 0;
for (int i = 2; i<=10;) {
  fourth++;
  fourth%=4;
  vec.push_back(i);
  if (fourth==0) {
     i++;
  }      
}
0 голосов
/ 03 мая 2011

Мне удалось создать объявление статического массива и передать этот массив в вектор при инициализации без проблем. Довольно чисто тоже:


const int initialValues[36] = {0,1,2...,35};
std::vector foo(initialValues);

Работает с константами, но не пробовал с неконстантными массивами.

...