crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Что я не так делаю с указателями?
Shaitan
  опции профиля:
сообщение 26.8.2015, 19:33
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 22.7.2015
Пользователь №: 4418

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Решил написать небоьшую программу, которая будет читать данные из тектового файла. Данные представляют собой простой список. Id, Name, Field1,Field2.
Для начало создал свою структуру:
struct RElement
{
    int     id;
    QString *name;
    int     field1;// const;
    int     field2;// const;
};


После Запускается функция в которую передаю Список обработанных строк.
Этот список я разбиваю на группы. Группы разделенв ";". Каждую группу я записываю в промежуточный список.
void runCode(QStringList     _strList)
{
    QStringList         strListLine,strListLineSend;
    QList <RElement>   codeList;
    RRElement           rVar;

    foreach(QString str, _strList)
    {
        strListLine.append(str.toLower());
        if(str == ";")
        {
            runLineCode(&codeList,strListLine);//запускаем функцию
            strListLine.clear();
        }
    }

    while(codeList.count() > 0);//oisEmpty())
    {
        rVar = codeList.takeFirst();
        delete &rVar;
    }
}


Этот Список передаю в процедуру создание списка указателей структур.
По возвращению из неё пытаюсь очищать промежуточный список. И тут у меня лезут ошибки
void runLineCode(QList <RElement> *listCode,
                 QStringList     _strList)
{
    int         i = 0,leght;
    int         id = 1;
    int         typeVar;
    QString     nameTypeVar = "";
    QString     typeNameStr;
    char        ch;
    RElement   *var;

    if((_strList[i] == "point")||(_strList[i] == "poligon")||(_strList[i] == "line"))
    {
        if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
        {
            nameTypeVar = _strList[i];
            if(nameTypeVar == "point")
                typeVar = 1;
            else
                if(nameTypeVar == "poligon")
                    typeVar = 2;
                else
                    if(nameTypeVar == "line")
                        typeVar = 3;
            i++;
        }
    }

    if((typeVar > 0) && (i > 0))
    {
        leght = _strList.length() - i;
        while(leght >= i && _strList[i] != ";")
        {
            if(_strList[i] != ",")
            {
                var->id = id;
                var->type = typeVar;
                var->field1 = 1;
                var->field2 = 0;
                listCode->append(*var);
                id++;
                var = var + 1;
            }
            i++;
        }
    }
}


Если в фунции не создавать указатель на структуру, то промежуточный список нормально очищается.
Что я не так делаю?
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Shaitan
  опции профиля:
сообщение 27.8.2015, 13:03
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 22.7.2015
Пользователь №: 4418

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 27.8.2015, 11:01) *
ну, при беглом просмотре кода, сразу же в первом блоке:

delete &rVar;


зачем тут адрес? подумай, что ты удаляешь.

вообще, логика кода какая-то странная. ты не проверяешь, что _strList содержит минимум два элемента, хотя обращаешься к ним.

потом, вот это условие тоже какое-то малопонятное:

leght = _strList.length() - i;
while(leght >= i ...

Насчёт
delete &rVar; Это я пытаюсь очистить память от указателей. Согласен нужно это сделать иначе.

Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";"

Цитата(Trisch @ 26.8.2015, 23:29) *
А какие ошибки лезут?

Я вечером опишу подробнее. Постараюсь со скриншотами.


Если очень кратко. Я создаю список структур, а после я этот список очищаю и высвобождаю память под структурами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.8.2015, 15:32
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Shaitan @ 27.8.2015, 15:03) *
Насчёт
delete &rVar; Это я пытаюсь очистить память от указателей. Согласен нужно это сделать иначе.

это выражение просто вообще смысла не имеет, причём в любом контексте. и оно всегда будет вызывать сбой в памяти.

Цитата(Shaitan @ 27.8.2015, 15:03) *
Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";"

нет. до конца это списка это никогда не дойдёт, потому что условие leght >= i его выкинет ровно посередине.
простая система уравнений
Цитата
leght = _strList.length() - i;
leght = i;

даёт
Цитата
i = _strList.length()/2;

так что с логикой тут серьёзные проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 5:20