crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Что я не так делаю с указателями?
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++;
        }
    }
}


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


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

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




Репутация:   0  


А какие ошибки лезут?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.8.2015, 11:01
Сообщение #3


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

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

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




Репутация:   12  


ну, при беглом просмотре кода, сразу же в первом блоке:
   delete &rVar;

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

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

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


не исключено, что там ещё есть ошибки логические.
в общем, внимательнее надо код писать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Shaitan
  опции профиля:
сообщение 27.8.2015, 13:03
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 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
Сообщение #5


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

Группа: Модератор
Сообщений: 1594
Регистрация: 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;

так что с логикой тут серьёзные проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Shaitan
  опции профиля:
сообщение 27.8.2015, 16:48
Сообщение #6


Новичок


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

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




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 27.8.2015, 19:52
Сообщение #7


Новичок


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

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




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 27.8.2015, 21:04
Сообщение #8


Новичок


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

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




Репутация:   0  


Причину нашёл. Я не инициализировал указатель на структкру.
var = new RVariable();
Проблема решена.
Всем спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.8.2015, 10:36
Сообщение #9


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

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

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




Репутация:   12  


Цитата(Shaitan @ 27.8.2015, 18:48) *
Спасибо за ошибку.

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

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

например, ты уверен, что это условие написано правильно?
if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Shaitan
  опции профиля:
сообщение 28.8.2015, 19:39
Сообщение #10


Новичок


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

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




Репутация:   0  


Цитата(Iron Bug @ 28.8.2015, 10:36) *
например, ты уверен, что это условие написано правильно?

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

Чёрт. Вечно я вместо "И" ставлю "ИЛИ"..
Спасибо ещё раз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 10.4.2020, 0:30