Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 03.11.2016, 14:41   #161
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 12,383
Репутация: 2542

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Дык сказал уже. Не разыменовывайте указатель когда в нем null или непонятно что. Только когда он указывает на объект (после new ProgressWidget в данном случае).
Alex11223 вне форума   Ответить с цитированием
Старый 03.11.2016, 14:46   #162
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

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

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

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();

Alex11223 вне форума   Ответить с цитированием
Старый 03.11.2016, 15:01   #164
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 15:07   #165
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

если я делаю ее локальной
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, 15:08   #166
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 12,383
Репутация: 2542

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

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

Чтобы не падало при вызове функции надо не вызывать ее когда в указателе непонятно что или null.
Чтобы иметь возможность "инициализировать"/сбрасывать состояние больше 1 раза во время жизни объекта можно просто перенести это из конструктора в ту функцию например.
Alex11223 вне форума   Ответить с цитированием
Старый 03.11.2016, 15:12   #167
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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 в 15:14.
stasJun вне форума   Ответить с цитированием
Старый 03.11.2016, 15:15   #168
stasJun
Форумчанин
 
Регистрация: 17.10.2016
Сообщений: 95
Репутация: 10
По умолчанию

или вы имеете веду что :
Код:

if (mProgressWidget == nullptr)

тоже не нужно?
stasJun вне форума   Ответить с цитированием
Старый 03.11.2016, 16:28   #169
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 12,383
Репутация: 2542

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от 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) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент указатель не ссылается ни на одну из допустимых ячеек.

.......

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

........

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

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

.........
- Используйте указатели правильно
- Инициализируйте указатели. Старайтесь инициализировать переменные сразу при объявлении
Alex11223 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




11:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru