0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
||||||
1 | ||||||
Segfault при прасинге файла19.08.2016, 17:37. Показов 800. Ответов 9
С++ знаю плоховато. Решил написать себе генератор to-do list`a, вроде даже начало было неплохим, но потом обнаружил неприятную ошибку. Суть программы в том, что на основе секций в текстовом файле вида:
{ title строка level натуральное число depends строка description строка urgency число от 1 до 20 importance число от 1 до 20 } программа формировала бы список дел и записывала его в файл. Заступорился я на этапе парсинга файла с секциями: если секция в файле одна, то всё парсится в переменные нормально, но если больше, то происходит ошибка сегментации. Код программы (незавершённый):
cout << tmp << endl; , то при одной секции в todo.daily вывод команды будет:{ title level depends description urgency importance } А если увеличить количество секций до 2 или больше, то вывод будет таким: { title level depends description urgency importance } { title Ошибка сегментирования (core dumped) Т. е. сегфолт в функции get во время обработки заголовка второй секции. Я сам не особо понимаю, в чём может быть проблема, прошу объяснить, что происходит, и как это пофиксить.
0
|
19.08.2016, 17:37 | |
Ответы с готовыми решениями:
9
SegFault при вводе стрококвого поля структуры QDoubleSpinBox - segfault при вызове value(), setValue() Segfault при присвоении значения массиву GC+SEGFAULT |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
19.08.2016, 17:48 | 2 |
0
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
19.08.2016, 17:55 [ТС] | 3 |
Не знаю...
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
19.08.2016, 17:58 | 4 |
1 байт.
А пытаешься ты читать в него целую строку. В итоге получаешь ошибку времени исполнения. Используй std::string. Он сам следит за перераспределением памяти, и обеспечит чтение строки произвольного размера.
0
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
19.08.2016, 18:12 [ТС] | 5 |
Как понять "читать строку в него"? Почему первый цикл проходит нормально? Пробовал делать
char *tmp = new char [число] , ничего не изменяется. Если со string делать, то что использовать вместо strcmp("text",tmp)) ?Добавлено через 9 минут Сегфолт происходит даже если tmp -- это просто массив из N символов.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
19.08.2016, 18:19 | 6 | |||||
Да очень просто, у тебя выделен один байт.
Оператор >> потока принимает указатель на этот один байт и считает, что это указатель на начало буфера, и пытается записать в него строку. Но т.к. реально в нашем "буфере" только один байт, он пишет за пределы выделенной нам памяти. Что в конечном итоге приводит к падению. Везет. Правильно, потому что у тебя точно такая же проблема в main. Там ты опять выделил память только для одного объекта item. А внутри функции get пытаешься работать с указателем так, как будто бы у тебя массив. В итоге опять тот же сценарий. Пишем за пределы выделенной памяти - получаем сегфолт.
1
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
19.08.2016, 18:36 [ТС] | 7 |
Ладно, понял. А как тогда сделать, чтобы элементы массива структур данных создавались по мере надобности (каждый инкремент переменной i), а не сразу в определённом количестве при объявлении
item *task = new item[N]; ?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
19.08.2016, 18:56 | 8 | |||||
Посмотри std::vector или std::list.
Добавлено через 3 минуты JustOneProblem, Кликните здесь для просмотра всего текста
0
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
20.08.2016, 23:44 [ТС] | 9 |
А что означает строчка
current = item(); , и можно ли обойтись без создания ещё одного элемента структуры (current)?Добавлено через 13 минут Ах, да почему & tasks , а не просто tasks ?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
21.08.2016, 00:20 | 10 |
Можно. Придется немного менять алгоритм разбора.
Это сброс значений полей, нужно в случае, если у нас i-я итерация с неполностью заполненным полями - чтобы не записались значения предыдущей записи. Ну мы вектор внутри функции заполняем же.
1
|
21.08.2016, 00:20 | |
21.08.2016, 00:20 | |
Помогаю со студенческими работами здесь
10
Segfault at 0 .error Segfault на ровном месте Segfault после WriteProcessMemory std::max segfault Большой массив данных и segfault Один из способов вызвать segfault. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |