Здравствуйте, гость ( Вход | Регистрация )
Litkevich Yuriy | Дата 6.5.2010, 10:47 |
Тогда почему он вообще скомпилировал... потому что в этом месте оператор for всего лишь проверяет "тут ИСТИНА или ЛОЖЬ?", если результат выражения (в данном случае значение index) не нуль, значит ИСТИНА.тоже самое случается и в операторе if if (index = -1) тут компилятору не на что ругаться, он присвоит переменной index значение -1, это значение НЕ ЛОЖЬ = ИСТИНА, условие выполниться |
|
kvak | Дата 6.5.2010, 8:01 |
Все. Понял. Спасибо. Попробывал сегодня поменять этот же проблемный цикл, и заработало, когда стал использовать слово break для выхода. Но вот реально все равно не пойму почему в том случае, когда не работает, не срабатывает условие index =-1; Не работает и зависает
Работает как надо и очень быстро
Блин. Все. Теперь понял. Я вместо условия задал приравнивание. Тогда почему он вообще скомпилировал... Хотя нет. все-таки у меня все-таки было изначально index !=1 И это условие получается не выполнялось. for (int index = 0 ; index != -1; index++ ) { index = Engine.indexOf(vxod[a], index); ... Т.е. я понимаю так , что цикл должен прерываться в том случае, когда index станет равен - 1 Т.е. как я понял ошибка в том, что когда index становится - 1, то перед проверкой условия происходит index++ и поэтому он всегда 0. Так получается ? |
|
BRE | Дата 6.5.2010, 6:34 |
Здесь разница в том, что в первом случае переменная index после тела цикла видна (доступна) не будет, а во втором будет. | |
kvak | Дата 6.5.2010, 6:22 |
Пнятненько. Так все-таки есть разница в этих примерах или нету ? Я нем могу привести примера, где бы была видна разница.
|
|
Litkevich Yuriy | Дата 5.5.2010, 23:50 |
QApplication::processEvents(); обрабатывает события поступающие в программу из ОСьки (например перетаскивание окна). Такие вещи надо делать в длинных циклах. Иначе программа не будет реагировать на внешние события.out << " - OK"; печатает в стандартный поток вывода строчку " - ОК"Как потом можно полезно использовать объект out ? ну как тебе вздумается так и используйИ еще немного не понял куда попадает qDebug() << "index =" << index; qDebug() - поток отладки, сделаный в Qt для удобства. Реально он печатет в стандартный поток ошибок. Но в него можно передавать не только строки, но и множество классов Qt. Например:Я имею ввиду, где я смогу увидеть qDebug() и что такое qDebug() ?
П.С. Оформляй исходники в сообщениях так, как написано здесь |
|
kvak | Дата 5.5.2010, 20:14 |
Спасибо всем за грамотные ответы. Теперь все встало на свои места для меня, новичка. Как же я не увидел, что есть функции 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, 15:06 |
index != -1; цикл прервётся только при не выполнении этого условияЯ сделал так: Раскрывающийся текст
нет смысла проверять всю строку, т.к. в асемблере одна строка - одна инструкция А еслиб и было то можно было бы сделать так: Раскрывающийся текст
|
|
Litkevich Yuriy | Дата 5.5.2010, 12:44 |
kvak, проблема тут: ты управляющую переменную цикла (index) в теле цикла меняешь, это опасно. И в данном случае, скормив программе произвольный файл, она всегда равна НУЛЮ |
|
BRE | Дата 5.5.2010, 12:34 |
kvak, Юра правильно подсказал, что определять переменные нужно до цикла, а вот инициализировать можно в нем. Или объясните, для какой цели используется int index и почему не хватает одного int c. Да это просто для примера, вопрос то был в другом. Кстати, часто используемый прием, например:
И туда же еще переменную для проверки длины результирующего буфера можно добавить. |
|
azure | Дата 5.5.2010, 12:18 |
for (int index = 0, int c =0 ; index != -1; index++, c++ ) { ... } Это не код а феерическая фигня. Откройте для себя break; Или объясните, для какой цели используется int index и почему не хватает одного int c. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 2.5.2024, 1:41 |