Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 18.04.2018, 07:43   #1
Uporka
Новичок
Джуниор
 
Регистрация: 18.04.2018
Сообщений: 3
По умолчанию Segfault на ровном месте.

Доброго времени суток. Пишу достаточно простую программку под 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.
Изображения
Тип файла: png Безымянный.png (48.6 Кб, 105 просмотров)
Uporka вне форума Ответить с цитированием
Старый 18.04.2018, 13:24   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Дебугер вам в помощь.
https://ru.wikipedia.org/wiki/GNU_Debugger
alexzk вне форума Ответить с цитированием
Старый 18.04.2018, 14:58   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,712
По умолчанию

А зачем Вы декрементируете num перед resize?
Вот и получаете вектор на 1 меньше, чем нужно
Black Fregat вне форума Ответить с цитированием
Старый 19.04.2018, 09:04   #4
Uporka
Новичок
Джуниор
 
Регистрация: 18.04.2018
Сообщений: 3
По умолчанию

Проблема решена. Неправильно передавал объект класса в фукнцию (shm mymem)
Uporka вне форума Ответить с цитированием
Старый 19.04.2018, 09:06   #5
Uporka
Новичок
Джуниор
 
Регистрация: 18.04.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А зачем Вы декрементируете num перед resize?
Вот и получаете вектор на 1 меньше, чем нужно
Потому что каким то чудесным образом getline находит что то между ";" и <EOF>.
И получается один лишний элемент массива.
Uporka вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Segfault в двусвязном списке в си Глеб Давыдов Помощь студентам 4 03.03.2016 23:06
Глупые проблемы на ровном месте Pablodiguerero C# (си шарп) 1 10.11.2014 15:18
Оставить кнопку на месте misher JavaScript, Ajax 4 02.03.2011 12:06
Футер остается на месте Southerner HTML и CSS 4 30.09.2010 16:19


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840