crossplatform.ru

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


  Ответ в Что я не так делаю с указателями?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
lanz Дата 29.8.2015, 0:10
 
    if((_strList[i] == "point")||(_strList[i] == "poligon")||(_strList[i] == "line"))
    {
        if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
        {

Это условие вообще лишнее, поскольку мы уже знаем, что _strList[i] это point, line или polygon.
Shaitan Дата 28.8.2015, 19:39
 
Цитата(Iron Bug @ 28.8.2015, 10:36) *
например, ты уверен, что это условие написано правильно?

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

Чёрт. Вечно я вместо "И" ставлю "ИЛИ"..
Спасибо ещё раз.
Iron Bug Дата 28.8.2015, 10:36
 
Цитата(Shaitan @ 27.8.2015, 18:48) *
Спасибо за ошибку.

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

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

например, ты уверен, что это условие написано правильно?
if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
Shaitan Дата 27.8.2015, 21:04
  Причину нашёл. Я не инициализировал указатель на структкру.
var = new RVariable();
Проблема решена.
Всем спасибо!
Shaitan Дата 27.8.2015, 19:52
 
Цитата(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, 16:48
 
Цитата(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.
Спасибо за ошибку.
Вечером постараюсь пересмотреть код.
Вопрос. Очистку списка структур я правильно делаю?
Iron Bug Дата 27.8.2015, 15:32
 
Цитата(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, 13:03
 
Цитата(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, 11:01
  ну, при беглом просмотре кода, сразу же в первом блоке:
   delete &rVar;

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

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

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


не исключено, что там ещё есть ошибки логические.
в общем, внимательнее надо код писать.
Trisch Дата 26.8.2015, 23:29
  А какие ошибки лезут?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 20:45