Доброго времени суток. Пишу достаточно простую программку под Linux. Вот кусок кода в котором вылазит ошибка сегментации:
void GetNames(vector<string> &names, vector<string> &types) { // Cчитывание и запись нужных sm-переменных из текст. файла в матрицу
if (!FlashHere()) return;
string buf;
unsigned int num = 0;
ifstream in(NAMES_DIR);
while (!in.eof()) {
getline(in, buf, ';');
num++;
cout << num << endl;
}
num = num -1;
names.resize(num);
types.resize(num);
in.clear();
in.seekg(0, ios::beg); //возврат потока в начало файла
for (unsigned int i = 0; i < names.size(); i++)
{
getline(in, buf, '.');
types[i] = buf;
getline(in, buf, ';');
names[i] = buf;
cout<< "|" << names[i] << "|" << types[i] << "|" << endl;
}
in.close();
}
void InitFBD(vector<string> &names, vector<string> &types, Shm &mymem) {
for (unsigned int num = 0; num < names.size(); num++) {
if (types[num] == "bool" && mymem.getType(names[num].c_str()) == BOOL)
{cout<< num << names[num] << " is ok"<< endl;continue;}
else if (types[num] == "float" && mymem.getType(names[num].c_str()) == FLOAT)
{cout<< num << names[num] << " is ok"<< endl;continue;}
else if (types[num] == "short" && mymem.getType(names[num].c_str()) == SHORT)
{cout<< num << names[num] << " is ok"<< endl;continue;}
else if (types[num] == "long" && mymem.getType(names[num].c_str()) == LONG)
{cout<< num << names[num] << " is ok"<< endl;continue;}
else{ cout<< num << " "<< "oooops";exit(1);}
}
cout << "oooops";
}
Видно я что то не понимаю. За пределы массива вроде нигде не выхожу. Последний цикл успешно завершается, но вместо последнего вывода в консоли видно Segmentation fault. Голову сломал. Help please.
Проблема решена. Неправильно передавал объект класса в функцию (Shm mymem).
Попробуйте не использовать потенциально опасное обращение к несуществующему элементу вектора через at()
, он же оператор []
:
void GetNames(vector<string> &names, vector<string> &types) {
if (!FlashHere()) return;
string buf;
ifstream in(NAMES_DIR);
while (!in.eof()) {
getline(in, buf, '.');
types.push_back(buf);
getline(in, buf, ';');
names.push_back(buf);
cout<< "|" << names.back() << "|" << types.back() << "|" << endl;
}
in.close();
Самая частая ошибка при работе с вектором - думать, что вектор это просто динамический массив. Это С++, тут само ничего не происходит, и даже если расширение data
у вектора спрятано под капотом STL, знать о нем и о его механике работы мы все равно обязаны
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть QGraphicsView виджет сделанный через дизайнерВ MainWidnow прописано:
Есть два инструмента взаимодействия с AD - это Active Directory Domain Services и Active Directory Service InterfacesЕсли я правильно понял, то первое - это просто сервис...
Здравствуйте, совсем недавно познакомился с CMake до этого работал с MakeИ вот после моего краткого знакомство никак не могу линкануть библиотеку...
Подключаю sqlite в нативе на андроидВылетает ошибка unable to open database file