Банальная программа. Но зависает., в чем же дело ? |
Здравствуйте, гость ( Вход | Регистрация )
Банальная программа. Но зависает., в чем же дело ? |
kvak |
5.5.2010, 4:22
Сообщение
#1
|
Студент Группа: Участник Сообщений: 51 Регистрация: 5.5.2010 Пользователь №: 1690 Спасибо сказали: 1 раз(а) Репутация: 0 |
Здравствуйте. Не могли бы вы посмотреть на исходники во вложении и сказать что в них неправильно. И поправить. Там маленькая программка. Задача в том, чтобы открыть log.txt и отобрать из него вхождения для каждого случая, если они встретятся. Мне кажется, что по идее все должно работать, но что-то я недопонимаю. После компиляции почему-то не хочет выполнять цикл и приложение не отвечает.
Кстати, в с++ можно задавать в цикле for по два инициализатора и два инкримента, типа такого ? for (int index = 0, int c =0 ; index != -1; index++, c++ ) { ... } Если да, то почему-то при компиляции это считалось ошибочным.
Прикрепленные файлы
|
|
|
Litkevich Yuriy |
5.5.2010, 11:46
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Кстати, в с++ можно задавать в цикле for по два инициализатора и два инкримента, типа такого ? самому применять никогда не приходилось, но форма записи подобна тому что есть у Шилдта:for (int index = 0, int c =0 ; index != -1; index++, c++ ) { ... } Если да, то почему-то при компиляции это считалось ошибочным. единственная разница - переменные у него объявлены до цикла
|
|
|
azure |
5.5.2010, 12:18
Сообщение
#3
|
Студент Группа: Участник Сообщений: 60 Регистрация: 24.12.2009 Пользователь №: 1332 Спасибо сказали: 5 раз(а) Репутация: 0 |
|
|
|
BRE |
5.5.2010, 12:34
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
kvak, Юра правильно подсказал, что определять переменные нужно до цикла, а вот инициализировать можно в нем.
Или объясните, для какой цели используется int index и почему не хватает одного int c. Да это просто для примера, вопрос то был в другом. Кстати, часто используемый прием, например:
И туда же еще переменную для проверки длины результирующего буфера можно добавить. Сообщение отредактировал BRE - 5.5.2010, 12:42 |
|
|
Litkevich Yuriy |
5.5.2010, 12:44
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
kvak, проблема тут:
ты управляющую переменную цикла (index) в теле цикла меняешь, это опасно. И в данном случае, скормив программе произвольный файл, она всегда равна НУЛЮ
|
|
|
Litkevich Yuriy |
5.5.2010, 15:06
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
index != -1; цикл прервётся только при не выполнении этого условияЯ сделал так: Раскрывающийся текст
нет смысла проверять всю строку, т.к. в асемблере одна строка - одна инструкция А еслиб и было то можно было бы сделать так: Раскрывающийся текст
|
|
|
kvak |
5.5.2010, 20:14
Сообщение
#7
|
Студент Группа: Участник Сообщений: 51 Регистрация: 5.5.2010 Пользователь №: 1690 Спасибо сказали: 1 раз(а) Репутация: 0 |
Спасибо всем за грамотные ответы. Теперь все встало на свои места для меня, новичка. Как же я не увидел, что есть функции contains и count. Но с другой стороны их тоже кто-то придумал. А подскажите еще, что дает эта функция:
QApplication::processEvents(); И это out << " - OK"; Как потом можно полезно использовать объект out ? И еще немного не понял куда попадает qDebug() << "index =" << index; Я имею ввиду, где я смогу увидеть qDebug() и что такое qDebug() ?________________________________________________________________________________ p.s. А я все-таки заставил работать это дело сам Мож не идеально, но зато работает. 50.000 строк обработало за несколько секунд. Раскрывающийся текст void MyProg::analize() { QString fileName; fileName = fpath->text(); QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Vmaanalize"), tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return; } ///////////////////////////start parser/////////////////////////////// while (!file.atEnd()) { QByteArray line = file.readLine(); start(line); } ///////////////////////////////////////////////////////////////// for (int a = 0; a < 40; a++) { QString two; QString equ = " = "; QString end = "\n"; QString result = (vxod[a]); two.setNum(summary[a]); result = result + equ + two + end; comit->insertPlainText(result); } } //////////////////////////////parser/////////////////////////////// void MyProg::start(QByteArray line) { QByteArray temp = line; char *lima = temp.data(); int size = 0; global = 0; while (size < 40){ parser(lima); global++; size++;} } void MyProg::parser(char* mypointer) { QString temp; QString temp2 = vxod[global]; int lee = temp2.length(); while (*mypointer) { temp.clear(); for (int length = 0; length < lee && *mypointer; length++) { temp.append(*mypointer); mypointer++; } if (!*mypointer) return; mypointer -= (lee - 1); int x = QString::compare(temp, temp2, Qt::CaseInsensitive); if (x == 0) summary[global]++; } } |
|
|
Litkevich Yuriy |
5.5.2010, 23:50
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
QApplication::processEvents(); обрабатывает события поступающие в программу из ОСьки (например перетаскивание окна). Такие вещи надо делать в длинных циклах. Иначе программа не будет реагировать на внешние события.out << " - OK"; печатает в стандартный поток вывода строчку " - ОК"Как потом можно полезно использовать объект out ? ну как тебе вздумается так и используйИ еще немного не понял куда попадает qDebug() << "index =" << index; qDebug() - поток отладки, сделаный в Qt для удобства. Реально он печатет в стандартный поток ошибок. Но в него можно передавать не только строки, но и множество классов Qt. Например:Я имею ввиду, где я смогу увидеть qDebug() и что такое qDebug() ?
П.С. Оформляй исходники в сообщениях так, как написано здесь |
|
|
kvak |
6.5.2010, 6:22
Сообщение
#9
|
Студент Группа: Участник Сообщений: 51 Регистрация: 5.5.2010 Пользователь №: 1690 Спасибо сказали: 1 раз(а) Репутация: 0 |
Пнятненько.
Так все-таки есть разница в этих примерах или нету ? Я нем могу привести примера, где бы была видна разница.
|
|
|
BRE |
6.5.2010, 6:34
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Здесь разница в том, что в первом случае переменная index после тела цикла видна (доступна) не будет, а во втором будет.
|
|
|
Текстовая версия | Сейчас: 28.1.2025, 13:45 |