2014-10-26 2 views
0

Im кодирует машину загадки и имеет проблемы с использованием элементов в моем векторе, получая только ошибку сегментации как ошибку. Мне нужно использовать функцию от каждого из роторов в моем векторе на одном символе, преобразовывая символ, когда итератор движется вперед, один раз вперед по списку, один раз назад. Я прокомментировал другие преобразования, чтобы изолировать проблему.Использование функции от каждого объекта в векторе

Machine.cpp

#include "Machine.h" 

using namespace std; 

Machine::Machine(const vector<Rotor>& rots, const Plugboard & pb) 
    : rotors(rots), plugboard(pb) {} 

// give c's alphabet index 
int Machine::getPosition(char c) { 
    if (c >= 'A' && c <= 'Z') { 
     return c - 'A'; 
    } else { 
     cout << "not an accepted character"; 
     return -1; 
    } 
} 

// give letter at index i in alphabet 
char Machine::atPosition(int i) { 
    assert(i >= 0 && i <= 25); 
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [i]; 
} 

char Machine::encode(char c) { 
    assert(c >= 'A' && c <= 'Z'); 
    // plugboard 
    // c = plugboard.getMatch(c); 
    // forward pass through rotors 
    for (std::vector<Rotor>::iterator it = rotors.begin(); it != rotors.end(); ++it) { 
     c = it->process(c); 
    } 
    // reflector 
    // c = Reflector::reflect(c); 
    // backwards pass through rotors 
    for (std::vector<Rotor>::iterator it = rotors.end(); it != rotors.begin(); --it) { 
     c = it->processInverse(c); 
    } 
    return c; 

} 

соответствующий вызов часть моей главной функции:

Rotor rot1(argv[1]); 
    Plugboard pb1(argv[2]); 
    vector<Rotor> rotors(1, rot1); 
    Machine machine(rotors, pb1); 
    machine.encode('A'); 
+1

Просто наконечник для отладки: вы обязательно должны попробовать использовать отладчик памяти при программировании на C++. Я лично рекомендовал бы drmemory. Это избавило меня от бесчисленных часов разочарования при попытке решить проблемы с сегом и утечки памяти. – Jason

+0

_ «получение ошибки сегментации как ошибка» _ Время запуска вашего отладчика! Тогда вы получите _lot_ еще ... –

ответ

5

Вы итерация назад неправильно. Итератор, на который указывает rotors.end(), находится за концом вектора, это не действительный объект ... так что вызов функции на нем является неопределенным поведением.

Если вы хотите перебрать в обратном направлении, вы должны использовать обратные итераторы:

for (std::vector<Rotor>::reverse_iterator it = rotors.rbegin(); 
    it != rotors.rend(); ++it) { 
    c = it->processInverse(c); 
} 
+0

Это правильно. Также можно было бы использовать итераторы без обратного, но в этом случае декремент должен был быть в начале тела вместо третьей позиции в цикле for (или в конце тела, который равен эквивалент). –

+0

Это решает, спасибо за помощь снова –

+0

@MichaelKarcher Уменьшение в порядке, где оно есть, вам просто нужно изменить границы, чтобы перейти от 'std :: next (rotors.end(), -1)' to 'std :: next (rotors.begin(), -1)'. Но это намного более запутанно. – Barry

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