crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Банальная программа. Но зависает.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 6.5.2010, 10:47
 
Цитата(kvak @ 6.5.2010, 12:01) *
Тогда почему он вообще скомпилировал...
потому что в этом месте оператор for всего лишь проверяет "тут ИСТИНА или ЛОЖЬ?", если результат выражения (в данном случае значение index) не нуль, значит ИСТИНА.
тоже самое случается и в операторе if
if (index = -1)
тут компилятору не на что ругаться, он присвоит переменной index значение -1, это значение НЕ ЛОЖЬ = ИСТИНА, условие выполниться
kvak Дата 6.5.2010, 8:01
  Все. Понял. Спасибо.
Попробывал сегодня поменять этот же проблемный цикл, и заработало, когда стал использовать слово break для выхода. Но вот реально все равно не пойму почему в том случае, когда не работает, не срабатывает условие
index =-1;

Не работает и зависает

while  (!file.atEnd()) 
{

Engine = file.readLine();

for (int a = 0; a < size; a++)
  {
            int c = 0;
            for (int index = 0; index =-1; index++ ) {
            index = Engine.indexOf(vxod[a], index);
            summary[a] += c;
            c++;            
        }  
  }          
}



Работает как надо и очень быстро

while  (!file.atEnd()) 
{

Engine = file.readLine();

for (int a = 0; a < size; a++)
   {
            for (int index = 0;; index++ ) {
            index = Engine.indexOf(vxod[a], index);
            if (index == - 1)
            break;
            summary[a]++;
        }  
   }          
}




Блин. Все. Теперь понял. Я вместо условия задал приравнивание. Тогда почему он вообще скомпилировал...

Хотя нет. все-таки у меня все-таки было изначально 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
  Пнятненько.
Так все-таки есть разница в этих примерах или нету ? Я нем могу привести примера, где бы была видна разница.
1.
for (int index = 0; index < 100; index++ )
2.
int index;
for (index = 0; index < 100; index++ )


Litkevich Yuriy Дата 5.5.2010, 23:50
 
Цитата(kvak @ 6.5.2010, 0:14) *
QApplication::processEvents();
обрабатывает события поступающие в программу из ОСьки (например перетаскивание окна). Такие вещи надо делать в длинных циклах. Иначе программа не будет реагировать на внешние события.

Цитата(kvak @ 6.5.2010, 0:14) *
out << " - OK";
печатает в стандартный поток вывода строчку " - ОК"

Цитата(kvak @ 6.5.2010, 0:14) *
Как потом можно полезно использовать объект out ?
ну как тебе вздумается так и используй

Цитата(kvak @ 6.5.2010, 0:14) *
И еще немного не понял куда попадает qDebug() << "index =" << index;
Я имею ввиду, где я смогу увидеть qDebug() и что такое qDebug() ?
qDebug() - поток отладки, сделаный в Qt для удобства. Реально он печатет в стандартный поток ошибок. Но в него можно передавать не только строки, но и множество классов Qt. Например:
QPoint point(10, 20);
qDebug() << "point = " << point;


П.С.
Оформляй исходники в сообщениях так, как написано здесь
kvak Дата 5.5.2010, 20:14
  Спасибо всем за грамотные ответы. Теперь все встало на свои места для меня, новичка. Как же я не увидел, что есть функции contains и count. Но с другой стороны их тоже кто-то придумал. А подскажите еще, что дает эта функция:
QApplication::processEvents();
И это
out << " - OK";
Как потом можно полезно использовать объект out ?
И еще немного не понял куда попадает qDebug() << "index =" << index;
Я имею ввиду, где я смогу увидеть qDebug() и что такое qDebug() ?________________________________________________________________________________

p.s. А я все-таки заставил работать это дело сам :rolleyes: Мож не идеально, но зато работает. 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
 
Цитата(Litkevich Yuriy @ 5.5.2010, 16:44) *
index != -1;
цикл прервётся только при не выполнении этого условия

Я сделал так:
Раскрывающийся текст
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/////////////////////////
    const QString slesh = "/";
    const QString end = "\n";
    const QString equ = " = ";
    QString two;
    

    QTextStream out(stdout);
    
    const int size = vxod.size();     //число инструкций из базы данных
    int cnt = 0;
    while  (!file.atEnd()){
        QString line = file.readLine();
        cnt++;
        out << "[" << cnt << "] line = " << line;
        QApplication::processEvents();
        for (int a = 0; a < size; a++){
            if (line.contains(vxod[a])){
                out << " - OK";
                summary[a]++;
            }
        }
        out << endl << flush;
    }

    for (int a = 0; a < size; a++){
        QString result = (vxod[a]);
        two = two.setNum(summary[a]);
        result = result + equ + two + end;
        comit->insertPlainText(result);
    }    

    return;

}


нет смысла проверять всю строку, т.к. в асемблере одна строка - одна инструкция

А еслиб и было то можно было бы сделать так:
Раскрывающийся текст
for (int a = 0; a < size; a++){
    int i = line.count(vxod[a])
    if (i){
        out << " - OK";
        summary[a] += i;
    }
}
Litkevich Yuriy Дата 5.5.2010, 12:44
  kvak, проблема тут:
            for (int index = 0; index != -1; index++ ) {
            qDebug() << "index =" << index;
            index = Engine.indexOf(vxod[a], index);
            summary[a] += c;
            c++;            
        }
ты управляющую переменную цикла (index) в теле цикла меняешь, это опасно. И в данном случае, скормив программе произвольный файл, она всегда равна НУЛЮ
BRE Дата 5.5.2010, 12:34
  kvak, Юра правильно подсказал, что определять переменные нужно до цикла, а вот инициализировать можно в нем.

Цитата(azure @ 5.5.2010, 13:18) *
Или объясните, для какой цели используется int index и почему не хватает одного int c.

Да это просто для примера, вопрос то был в другом.
Кстати, часто используемый прием, например:
    char in[ 100 ] = { "Test string" };
    char out[ 100 ] = { 0 };                                                                                                        

    char *pIn;
    char *pOut;
    for( pIn = in, pOut = out; *pIn; ++pIn, ++pOut )
        *pOut = *pIn;


И туда же еще переменную для проверки длины результирующего буфера можно добавить. :)
azure Дата 5.5.2010, 12:18
 
Цитата(kvak @ 5.5.2010, 4:22) *
for (int index = 0, int c =0 ; index != -1; index++, c++ )
{
...
}


Это не код а феерическая фигня. Откройте для себя break; Или объясните, для какой цели используется int index и почему не хватает одного int c.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 2.5.2024, 1:41