НЕИСПРАВНОСТЬ СЕГМЕНТАЦИИ в векторной <string>итерационной функции, используемой для рисования текста в моем собственном кодированном графическом интерфейсе - PullRequest
0 голосов
/ 03 августа 2010

Привет всем,

ОШИБКА: Программа получила сигнал 'SIGSEGV', ошибка сегментации.

У меня возникли проблемы со следующим кодом, создающим вышеуказанную ошибку в Code :: Blocks.Это окно чата, которое я использую для программы сетевого чата, где вектор заполнен строками текста для каждой строки журнала чата.Я не понимаю, почему это вызывает ошибку сегментации, поскольку я не пытаюсь записать в какую-либо память эту процедуру.

Строка, создающая ошибку: [if (iter-> empty ());],Если я уберу эту строку, она все равно выдаст ошибку при вызове функции DrawText.

Кто-нибудь может мне помочь?В настоящий момент для меня это был кошмар, когда я пытался отладить его!

К вашему сведению -> Я пишу код в Code :: Blocks в Ubuntu.Программа использует SDL, особенно заголовки «net» и «thread».Функция DrawText является просто оболочкой для TTF_RenderTextBlended () и SDL_BlitSurface, но я знаю, что ошибка не в функции DrawText напрямую, потому что я использовал ее во многих других проектах без проблем.

Все, что я проверяюв связи с проблемой со строками в векторе, но я не могу понять, что?

void GUI_ChatBox::Render(SDL_Surface *screen)
{
  int line = 0;
  for(vector<string>::reverse_iterator iter = L.rbegin(); iter != L.rend(); ++iter)
  {
    if(iter->empty())
        continue;

    ++line;
    DrawText(screen, iter->c_str(), x, (y + height) - (line * CHAR_HEIGHT));
  }
}

L в приведенном выше примере - сокращение от LineBuffer.С ним взаимодействует только одна другая функция, и это функция, используемая для добавления текста в вектор.Вот оно:

void GUI_ChatBox::AddText(std::string text)
{
    ++index;
    if(index >= maxLines)
    {
        index = maxLines;
        LineBuffer.erase(LineBuffer.begin());
    }

    LineBuffer.push_back(text);
}

Эта функция обычно получает массив char * в качестве параметра std :: string, но я сделал это в другом месте без проблем.

Ответы [ 3 ]

0 голосов
/ 03 августа 2010
  1. Если 0 не является допустимым значением аргумента функции screen, тогда я настоятельно рекомендую передавать по ссылке, а не по указателю;даже сделайте это const, если DrawText, где оно фактически используется, разрешает это.
  2. Вы говорите, что «Строка, создающая ошибку, - [if (iter-> empty ());].удалите эту строку, тогда она все равно выдаст ошибку при вызове функции DrawText. "Какой наименее общий знаменатель в этих двух строках?Да, iter->.
  3. Откуда взялся iter?Да, L.
  4. Откуда взялся L?Что ж, только вы это знаете.
  5. Где-то между созданием L и использованием его в GUI_ChatBox::Render, оно сбрасывается.
0 голосов
/ 03 августа 2010

Я прошел весь код, просматривая то, что было передано в функцию AddText, которая могла бы сломать мой вектор LineBuffer.

Я нашел одну неясную ссылку на функцию GetText для моего Textbox, которая выдастchar *) с символами в текстовом поле.

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

Думаю, я бы поднял этот ответ на случай, если он поможет кому-то еще в такой же ситуации.

0 голосов
/ 03 августа 2010

Где определено L? И как это инициализируется? Изменяет ли какой-либо другой код его после инициализации, намеренно или случайно? Похоже, вектор почему-то содержит мусор. Проблема почти наверняка не в коде, который вы здесь представили, а в другом коде, взаимодействующем с L Может быть, у вас есть массив, переполненный где-то еще, например, L.

...