У меня есть вектор со списком команд, как показано ниже:
//COMMAND INITIALISATION
std::vector<std::string> objectInitialisationAction;
objectInitialisationAction.push_back("CREATE"); //0
objectInitialisationAction.push_back("END_CREATE"); //1
objectInitialisationAction.push_back("START_TIMELINE"); //2
Я только получаю доступ к этому вектору, используя мою функцию, показанную ниже:
int SearchFor(std::string search, std::vector<std::string> from)
{
int result=-1;
for(int i=0; i<from.size(); i++)
if(from[i]==search)
{
result=i;
break;
}
if(result == -1)
{
std::ofstream error("searching.txt");
error<<"search failed, original value = \""<<search<<"\""<<std::endl;
error<<"values in the table:"<<std::endl;
for(int i=0; i<from.size();i++)
error<<"value "<<i<<": "<<from[i]<<std::endl;
error.close();
}
return result;
}
Только с одним вызовом функции:
commandNum=SearchFor(command[0], objectInitialisationAction);
Это единственное место, где я получаю доступ к вектору, но когда я вызываю функцию в n-й раз (она всегда тормозит в одной и той же точке кода), она получает неверный доступ и выдает бессмысленный текст. Часть кода, который я перечислю ниже:
search failed, original value = "CREATE"values in the table:
value 0: CREATE Øç¼ Œ Ôç¼ Œ Ðç¼ Exit ¼ç¼ ¸ç¼ Œ p«üxðù ; ´ç¼ Œ pëù@òø €< °ç¼ ŒBerlin Sans FB Demi e ¬ç¼ ˆ°¿^nmra œç¼ ŒBerlin Sans FB Demi e ˜ç¼ help ”ç¼ ˆ object_dump ç¼ test Œç¼ Ž spawn ˆç¼ ‹ load_map „ç¼ Ž
//and so on...
Любые предложения относительно того, почему вектор может так испортиться?
Ваш код выглядит правильно для меня. В этом случае должна быть другая часть вашего приложения, которая портит память. Например, может быть доступ к массиву вне диапазона, висячий указатель или использование после удаления где-нибудь. Такие инструменты, как Valgrind, могут вам помочь.
Кажется, все правильно. Скомпилируйте и выполните это. Если все правильно, возможно, проблема в другой части вашего кода.
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;int SearchFor(std::string search, std::vector<std::string> from)
{
int result=-1;
for(unsigned int i=0; i<from.size(); i++)
if(from[i]==search)
{
result=i;
break;
}
if(result == -1)
{
std::ofstream error("searching.txt");
error<<"search failed, original value = \""<<search<<"\""<<std::endl;
error<<"values in the table:"<<std::endl;
for(unsigned int i=0; i<from.size(); i++)
error<<"value "<<i<<": "<<from[i]<<std::endl;
error.close();
}
return result;
}
int main()
{
std::vector<std::string> objectInitialisationAction;
objectInitialisationAction.push_back("CREATE"); //0
objectInitialisationAction.push_back("END_CREATE"); //1
objectInitialisationAction.push_back("START_TIMELINE"); //2
for(unsigned int i=0; i<objectInitialisationAction.size(); i++)
{
cout<< objectInitialisationAction[i] << endl;
}
cout << "FOUND " << SearchFor("CREATE", objectInitialisationAction);
return 0;
}
Я предлагаю вам добавить using namespace std;
в начале файла, поэтому вы не должны добавлять std::blablabla
на каждом объявлении … ваш код будет более читабельным 🙂 и, пожалуйста …. INDENT IT 🙂
Код выглядит нормально, как есть. Наиболее вероятный сценарий для меня состоит в том, что поле длины ваших строк непреднамеренно перезаписывается, потому что команда, то есть фактические данные, все еще там. Просто строка думает, что она длиннее. (Перезаписывая персонажи не приведет к выводу, о котором вы сообщаете: команды будут перезаписаны, но длина строки все равно будет короткой.) Перезапись памяти обычно происходит через индекс массива или указатель, выходящий за пределы. Данные, на которые он указывает, должны иметь такую же связь со строками (в вашем примере локальные или глобальные / статические).
Одной из стратегий поиска ошибок может быть периодическая печать длины строк элементов objectInitialisationAction; если они слишком длинные, вы знаете, что-то пошло не так.
Это может помочь закомментировать код, используя своего рода стратегию бинарного поиска (закомментируйте половину — высмеивая его функциональность, чтобы прога продолжала работать — и посмотрите, все ли еще происходит ошибка, затем снова разделите неисправную часть и т. Д.).
Обратите внимание, что вы передаете вектор по значению в SearchFor (), что, возможно, непреднамеренно. Повреждение может произойти на стороне вызывающего или вызываемого абонента, что должно быть легко проверить.
Надеялся, что помог.
попробуйте передать все параметры через const:
int SearchFor(const std::string& search, const std::vector<std::string>& from)
{
...
}