Russian Qt Forum
Ноябрь 24, 2024, 01:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Обнуление указателя  (Прочитано 13247 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Октябрь 26, 2010, 17:01 »

Код ужасный.
А еще всякие *DataRepository << *emptyString; не очень красиво.
Да ох ты ж боже мой!  Улыбающийся Где же те "эталоны кода" на которые мы якобы должны равняться? Это живо напоминает нашу малышь, просто с др. стороны. Ладно. мое личное мнение

1) (косметика) Переменная "i" точно не в масть - это счетчик цикла.

2) (косметика)  Когда 2 или более if - всегда надо подумать, может здесь switch получше

3) (на вкус)
Код:
while (DataRepository->size() < (ColumnCount - 1)) *DataRepository << *emptyString;

Ну как-то оно "не то". Записать в 2 строчки явно лучше. И оте опрератоы << конечно ничего но напр append (без затей) облегчило бы понимание. А еще важнее - это вероятно метод (хотя подробностей/деталей задачи я не знаю)

4) Главное - подозрительный Day. Как я понял, он член класса. Так чего он так "втихаря" создается? А вдруг он уже создан? Однозначно это должны быть методы напр CreateDay, RemoveDay

А вообще ничего "ужастного" не вижу - мой код куда более ужастен  Улыбающийся
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #16 : Октябрь 26, 2010, 18:34 »

QStringList динамически создавать по-моему вообще не стоит. Можно в функцию передать имеющийся список по ссылке и с ним работать:
Код
C++ (Qt)
void func(QStringList &list)
{
// что-то делаем с list
}
Записан

Юра.
Alex_cs_gsp
Гость
« Ответ #17 : Октябрь 26, 2010, 20:05 »

 Смеющийся Особенно комментарии полезные. Если бы мне дали в таком ошибку искать я бы послал подальше.
« Последнее редактирование: Октябрь 26, 2010, 20:07 от Alex_cs_gsp » Записан
blood_shadow
Гость
« Ответ #18 : Октябрь 26, 2010, 20:46 »



ну вообщем я его переделал с учетом советов и получилось подобное:
Код:
void Analysis_of_accidents::addNewRecordConditions()
{
    Conditions = new conditions(SizeForDialogs);
    int resultCode;
    resultCode = Conditions->exec();

    switch(resultCode) {
        case QDialog::Accepted :  //  if pressed Ok
            {
                *DataRepository << Conditions->returnConditionsList();

                while (DataRepository->size() < (ColumnCount - 1))
                    *DataRepository << ("");

                delete Conditions;
                Conditions = 0;
                delete Day;
                delete Employer;

                emit StringListIsReady();
            }
            break;

        case Day_and_person::Next :  //  if pressed >>
            {
                *DataRepository << Conditions->returnConditionsList();
                addNewRecordPeoples();
            }
            break;

        case QDialog::Rejected :  //  if pressed Close
            {
                delete DataRepository;
                delete Conditions;
                Conditions = 0;
                delete Day;
                delete Employer;
                return;
            }
    }

    return;
}
Код
C++ (Qt)
 

Указатель на QStringList *DataRepository еще не нашел на что заменить, дело в том что в них храниться значения введенные в диалоговом окне и дальше этот *DataRepository используется при вызове второго диалогового окна
Код:
addNewRecordPeoples();

Познания в С++ невелики, так что прошу не винить за глупый вопрос -
вы советовали поменять
Код:
*DataRepository << ("");
на  
Код:
*DataRepository.append("");
, но компилятор выбивает ошибку
"void value not ignored as it ought to be " в этой же строке, из ассистанта я узнал что "append" возращает void a "<<" ссылку,
какая разница воид или ссылка ведь мы просто добавляем в конец пустую строку?

СОРРИ не доглядел два раза разименовал указатель
« Последнее редактирование: Октябрь 26, 2010, 20:50 от blood_shadow » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #19 : Октябрь 26, 2010, 21:06 »

1. conditions на стэке создать разве нельзя?
2. DataRepository->append("");
3. delete Day; - так и нужно?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #20 : Октябрь 26, 2010, 21:06 »

А вообще ничего "ужастного" не вижу - мой код куда более ужастен  Улыбающийся
Ты этим хвастаешься? Шокированный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #21 : Октябрь 26, 2010, 21:23 »

1. conditions на стэке создать разве нельзя?
2. DataRepository->append("");
3. delete Day; - так и нужно?


2. Спасибо это уже понял
3. Да, тут дело в том что при нажатии на кнопку ">>" создается следуещее окно схематически цепочка Day -> Employer-> Conditions -> People (каждое из которых есть диалоговым окном), а если в данном диалоговом окне нажата кнопка "Ок" или "Закрыть" то я освобождаю память удаляя эти окна и предадущие
Код:
delete Conditions;
Conditions = 0;
delete Day;
delete Employer;

Вот общая картина:
Код:
void Analysis_of_accidents::addNewRecord()
{
    Day = new Day_and_person(SizeForDialogs);
    // Construct structs for Data
    DataRepository = new QStringList;

    int resultCode;
    resultCode = Day->exec();

    switch(resultCode) {
       
        case QDialog::Accepted : // if pressed Ok
        {
            *DataRepository << Day->returnDay_and_personList();

            while (DataRepository->size() < (ColumnCount - 1))
                DataRepository->append("");

            delete Day;
            Day = 0;

            emit StringListIsReady();
        }
            break;

        case Day_and_person::Next :  // if pressed >>
        {
            *DataRepository << Day->returnDay_and_personList();
            addNewRecordEmployee();
        }
            break;

        case QDialog::Rejected : // if pressed Close
        {
            delete DataRepository;
            //delete Day;
            //Day = 0; ???
            return;
        }
    }

    return;
}

void Analysis_of_accidents::addNewRecordEmployee()
{
    Employer = new employee(SizeForDialogs);
    int resultCode;
    resultCode = Employer->exec();

    switch(resultCode) {
       
        case QDialog::Accepted :  //  if pressed Ok
            {
                *DataRepository << Employer->returnEmployeesList();

                while (DataRepository->size() < (ColumnCount - 1))
                    DataRepository->append("");

                delete Employer;
                Employer = 0;
                delete Day;

                emit StringListIsReady();
            }
                break;

        case Day_and_person::Next :  //  if pressed >>
            {
                *DataRepository << Employer->returnEmployeesList();
                addNewRecordConditions();
            }
                break;

        case QDialog::Rejected :  //  if pressed Close
            {
                delete DataRepository;
                delete Employer;
                Employer = 0;
                delete Day;
                return;
            }
    }

    return;
}

void Analysis_of_accidents::addNewRecordConditions()
{
    Conditions = new conditions(SizeForDialogs);
    int resultCode;
    resultCode = Conditions->exec();

    switch(resultCode) {
       
        case QDialog::Accepted :  //  if pressed Ok
            {
                *DataRepository << Conditions->returnConditionsList();

                while (DataRepository->size() < (ColumnCount - 1))
                    DataRepository->append("");

                delete Conditions;
                Conditions = 0;
                delete Day;
                delete Employer;

                emit StringListIsReady();
            }
            break;

        case Day_and_person::Next :  //  if pressed >>
            {
                *DataRepository << Conditions->returnConditionsList();
                addNewRecordPeoples();
            }
            break;

        case QDialog::Rejected :  //  if pressed Close
            {
                delete DataRepository;
                delete Conditions;
                Conditions = 0;
                delete Day;
                delete Employer;
                return;
            }
    }

    return;
}

void Analysis_of_accidents::addNewRecordPeoples()
{
    Peoples = new peoples(SizeForDialogs);
    int resultCode;
    resultCode = Peoples->exec();

    switch(resultCode)
    {
        case QDialog::Accepted :  //  if pressed Ok
            {
                *DataRepository << Peoples->returnPeoplesList();
                emit StringListIsReady();
            }
        break;

        case QDialog::Rejected :  //  if pressed Close
            {
                delete DataRepository;
            }
    }

    delete Day;
    delete Employer;
    delete Conditions;
    delete Peoples;

    return;
}

1. вопрос не понял
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #22 : Октябрь 26, 2010, 21:25 »

Day = new Day_and_person(SizeForDialogs); - в куче
Day_and_person Day (SizeForDialogs); - в стэке (удалять не нужно)

Тебе нужно пересмотреть архитектуру приложения.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #23 : Октябрь 26, 2010, 21:34 »

Day = new Day_and_person(SizeForDialogs); - в куче
Day_and_person Day (SizeForDialogs); - в стэке (удалять не нужно)

Тебе нужно пересмотреть архитектуру приложения.


а да, но это сделано умышлено - в недалеком будущем планирую добавить кнопку "<<" чтоб возвращаться назад, а делиты я прицепил чтобы лучше понять/почувствовать возвращение памяти
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Октябрь 26, 2010, 22:12 »

Вот общая картина:
Код:
void Analysis_of_accidents::addNewRecord()
{
    Day = new Day_and_person(SizeForDialogs);
    // Construct structs for Data
    DataRepository = new QStringList;
...
Не по уму. Упущено главное - за каждым членом класса надо следить, тем более за членом-указателем. Нельзя так резво его создавать "где хочу" - хотя бы потому что он уже может быть создан
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 22.