Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что я не так делаю с указателями?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Shaitan
Добрый день.
Решил написать небоьшую программу, которая будет читать данные из тектового файла. Данные представляют собой простой список. 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++;
        }
    }
}


Если в фунции не создавать указатель на структуру, то промежуточный список нормально очищается.
Что я не так делаю?
Заранее спасибо!
Trisch
А какие ошибки лезут?
Iron Bug
ну, при беглом просмотре кода, сразу же в первом блоке:
   delete &rVar;

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

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

потом, вот это условие тоже какое-то малопонятное:
leght = _strList.length() - i;
        while(leght >= i ...


не исключено, что там ещё есть ошибки логические.
в общем, внимательнее надо код писать.
Shaitan
Цитата(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
Цитата(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;

так что с логикой тут серьёзные проблемы.
Shaitan
Цитата(Iron Bug @ 27.8.2015, 15:32) *
Цитата(Shaitan @ 27.8.2015, 15:03) *
Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";"

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

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

так что с логикой тут серьёзные проблемы.

Чёрт. тут опечатка у меня.
Должно быть:
leght = _strList.length() - 1;
так как масив от нуля считается, потому и минус 1.
Спасибо за ошибку.
Вечером постараюсь пересмотреть код.
Вопрос. Очистку списка структур я правильно делаю?
Shaitan
Цитата(Trisch @ 26.8.2015, 23:29) *
А какие ошибки лезут?


После того отработала моя функция runLineCode, я очищая промежуточный список:
void runCode(QStringList     _strList)
{
    QStringList         strListLine,strListLineSend;
    QList <RElement>   codeList;

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

на строке strListLine.clear();
мой код выкидывает в
qarraydata.h
    static void deallocate(QArrayData *data)
    {
        Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
        QArrayData::deallocate(data, sizeof(T), Q_ALIGNOF(AlignmentDummy));
    }


на строку QArrayData::deallocate(data, sizeof(T), Q_ALIGNOF(AlignmentDummy));

Странно почему тут ошибка.
Вот исправленная функция после Ваших замечаний:
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() - 1;
        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
Причину нашёл. Я не инициализировал указатель на структкру.
var = new RVariable();
Проблема решена.
Всем спасибо!
Iron Bug
Цитата(Shaitan @ 27.8.2015, 18:48) *
Спасибо за ошибку.

да не за что. это твоя ошибка, ты её сам сделал ;)

код надо писать внимательно. если опыта нет, то тем более не нужно торопиться.

например, ты уверен, что это условие написано правильно?
if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
Shaitan
Цитата(Iron Bug @ 28.8.2015, 10:36) *
например, ты уверен, что это условие написано правильно?

if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))

Чёрт. Вечно я вместо "И" ставлю "ИЛИ"..
Спасибо ещё раз.
lanz
    if((_strList[i] == "point")||(_strList[i] == "poligon")||(_strList[i] == "line"))
    {
        if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
        {

Это условие вообще лишнее, поскольку мы уже знаем, что _strList[i] это point, line или polygon.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.