Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2016, 13:41   #161
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык сказал уже. Не разыменовывайте указатель когда в нем null или непонятно что. Только когда он указывает на объект (после new ProgressWidget в данном случае).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 13:46   #162
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Дык сказал уже. Не разыменовывайте указатель когда в нем null или непонятно что. Только когда он указывает на объект (после new ProgressWidget в данном случае).
честно я не понял. не нужно ставить * ? можете в коде которій я скинул частями написать, это надо, это нет
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 13:55   #163
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

https://ru.wikipedia.org/wiki/%D0%A3...D%D1%8B%D1%85)

так можно:
Код:
MyClass* obj = new MyClass;
obj->fun();
так нельзя:
Код:
MyClass* obj = nullptr;
obj->fun();
так тоже нельзя:
Код:
MyClass* obj;
obj->fun();
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 14:01   #164
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
https://ru.wikipedia.org/wiki/%D0%A3...D%D1%8B%D1%85)

так можно:
Код:
MyClass* obj = new MyClass;
obj->fun();
так нельзя:
Код:
MyClass* obj = nullptr;
obj->fun();
так тоже нельзя:
Код:
MyClass* obj;
obj->fun();
вы меня снова не поняли, у меня есть указатель
мне нужно через ню делать, НО как мне инициализировать, если переменая directorySizeInBytes ниже создаю,
Код:
FindFilesWidget::FindFilesWidget(QWidget *parent)
    : QWidget(parent)
    , mProgressWidget(new ProgressWidget(directorySizeInBytes))// как мне  тут поступить
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 14:07   #165
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

если я делаю ее локальной
qint64 mDirectorySizeInBytes;
то прогрес бар не работает:
Код:
FindFilesWidget::FindFilesWidget(QWidget *parent)
    : QWidget(parent)
    , mDirectorySizeInBytes(0)
    , mProgressWidget(new ProgressWidget(mDirectorySizeInBytes))
{
Код:
void FindFilesWidget::startClicked()
{
    mFoundFilesList->clear();
    mProgressWidget->restart();
    const int idealThreadCount = QThread::idealThreadCount();
    for (size_t index = 0; index < mThreads.size(); ++index)
        delete mThreads[index];
    mThreads.clear();
    mThreads.reserve(idealThreadCount);

    mPaths.clear();
    QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
    while (dirIt.hasNext())
    {
        dirIt.next();
        QFileInfo fileInfo(dirIt.filePath());
        if (fileInfo.isFile())
        {
            if (fileInfo.suffix() == "txt")
            {
                mPaths.push_back(dirIt.filePath());
                mDirectorySizeInBytes += fileInfo.size();
            }
        }
    }
 const std::vector<Range> ranges = GenerateRanges(idealThreadCount, mPaths.size());
    for (size_t index = 0; index < idealThreadCount; ++index)
        mThreads.push_back(new FindWordInFilesThread(mPaths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength));

    if (mProgressWidget == nullptr)
       mProgressWidget = new ProgressWidget(mDirectorySizeInBytes);

.....
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 14:08   #166
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от stasJun Посмотреть сообщение
у меня есть указатель
мне нужно через ню делать, НО как мне инициализировать, если переменая directorySizeInBytes ниже создаю,
Так это разные вещи.

Чтобы не падало при вызове функции надо не вызывать ее когда в указателе непонятно что или null.
Чтобы иметь возможность "инициализировать"/сбрасывать состояние больше 1 раза во время жизни объекта можно просто перенести это из конструктора в ту функцию например.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 14:12   #167
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так это разные вещи.

Чтобы не падало при вызове функции надо не вызывать ее когда в указателе непонятно что или null.
Чтобы иметь возможность "инициализировать"/сбрасывать состояние больше 1 раза во время жизни объекта можно просто перенести это из конструктора в ту функцию например.
так если вы посмотрете у меня в констуркторе нету инициализации!!
я ее убрал, потом додал бо проблему это не решило.
Код:
FindFilesWidget::FindFilesWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("Find Files");

    QVBoxLayout* vLayout = new QVBoxLayout(this);
    vLayout->setSpacing(6);
    vLayout->setContentsMargins(11, 11, 11, 11);
    vLayout->addWidget(createSelectDirectoryGroup());
    vLayout->addWidget(createSearchWordGroup());
    vLayout->addWidget(createFoundFilesGroup());
    setLayout(vLayout);
    resize(600, 600);
}

void FindFilesWidget::startClicked()
{
    mFoundFilesList->clear();
    mProgressWidget->restart();
    const int idealThreadCount = QThread::idealThreadCount();
    for (size_t index = 0; index < mThreads.size(); ++index)
        delete mThreads[index];
    mThreads.clear();
    mThreads.reserve(idealThreadCount);

    mPaths.clear();
    QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
    qint64 directorySizeInBytes = 0;
    while (dirIt.hasNext())
    {
        dirIt.next();
        QFileInfo fileInfo(dirIt.filePath());
        if (fileInfo.isFile())
        {
            if (fileInfo.suffix() == "txt")
            {
                mPaths.push_back(dirIt.filePath());
                directorySizeInBytes += fileInfo.size();
            }
        }
    }

    const std::vector<Range> ranges = GenerateRanges(idealThreadCount, mPaths.size());
    for (size_t index = 0; index < idealThreadCount; ++index)
        mThreads.push_back(new FindWordInFilesThread(mPaths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength));

    if (mProgressWidget == nullptr)
       mProgressWidget = new ProgressWidget(directorySizeInBytes);

    QObject::connect(mProgressWidget, SIGNAL(finished()), this, SLOT(finished()));
    QObject::connect(mProgressWidget, SIGNAL(paused()), this, SLOT(pausedClicked()));
    QObject::connect(mProgressWidget, SIGNAL(continued()), this, SLOT(continuedClicked()));
    QObject::connect(mProgressWidget, SIGNAL(canceled()), this, SLOT(cancelClicked()));

    mProgressWidget->show();

    for (size_t index = 0; index < idealThreadCount; ++index)
    {
        QObject::connect(mThreads[index], SIGNAL(progressChanged(qint64)), mProgressWidget, SLOT(progressChanged(qint64)));
        QObject::connect(mThreads[index], SIGNAL(fileFound(const QString&)), this, SLOT(fileFound(const QString&)));
    }

    for (size_t index = 0; index < idealThreadCount; ++index)
        mThreads[index]->start();

}

Последний раз редактировалось stasJun; 03.11.2016 в 14:14.
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 14:15   #168
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

или вы имеете веду что :
Код:
if (mProgressWidget == nullptr)
тоже не нужно?
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 15:28   #169
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от stasJun Посмотреть сообщение
так если вы посмотрете у меня в констуркторе нету инициализации!!
я про конструктор ProgressWidget с mDirectorySizeInBytes


Цитата:
Сообщение от stasJun Посмотреть сообщение
или вы имеете веду что :
тоже не нужно?
я имею в виду что если на момент вызова
Код:
mProgressWidget->restart();
в mProgressWidget находится null или какой-то мусор вместо адреса существующего экземпляра ProgressWidget, то программа упадет.

Цитата:
Сообщение от https://ru.wikipedia.org/wiki/%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%8 2%D0%B5%D0%BB%D1%8C_(%D1%82%D0%B8%D 0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B %D1%85)

Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент указатель не ссылается ни на одну из допустимых ячеек.

.......

Языки программирования, в которых предусмотрен тип указателей, содержат, как правило, две основные операции над ними: присваивание и разыменование. Первая присваивает указателю некоторый адрес. Вторая служит для обращения к значению в памяти, на которое указывает указатель.

........

Достаточно легко записать в указатель неправильное значение, что может вызвать трудновоспроизводимую ошибку. Например, вы случайно поменяли адрес указателя в памяти, или неправильно выделили под информацию память и тут вас может ожидать сюрприз: другая очень важная переменная, которая используется только внутри программы будет перезаписана... Понять, где именно находится ошибка и воспроизвести её будет нелегко

Для решения части проблем есть методы предохранения и страховки:

.........
- Используйте указатели правильно
- Инициализируйте указатели. Старайтесь инициализировать переменные сразу при объявлении
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слов в файле Stepan_P Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 25.12.2015 14:14
Поиск слов в текстовом файле slipkos Помощь студентам 4 02.06.2013 19:18
Поиск симметричных слов в файле Almost Паскаль, Turbo Pascal, PascalABC.NET 1 10.01.2013 08:53
Поиск слов в файле сушка Общие вопросы по программированию, компьютерный форум 1 08.04.2012 12:44
Поиск слов в текстовом файле svt Помощь студентам 8 07.11.2009 19:56