crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Банальная программа. Но зависает., в чем же дело ?
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++ )
{
...
}
Если да, то почему-то при компиляции это считалось ошибочным.
Прикрепленные файлы
Прикрепленный файл  PACKAGE.zip ( 7.54 килобайт ) Кол-во скачиваний: 118
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.5.2010, 11:46
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kvak @ 5.5.2010, 8:22) *
Кстати, в с++ можно задавать в цикле for по два инициализатора и два инкримента, типа такого ?
for (int index = 0, int c =0 ; index != -1; index++, c++ )
{
...
}
Если да, то почему-то при компиляции это считалось ошибочным.
самому применять никогда не приходилось, но форма записи подобна тому что есть у Шилдта:
int i, j;
for (i = 0, j =0; i <= j; i++, j++ )
{
...
}
единственная разница - переменные у него объявлены до цикла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 5.5.2010, 12:18
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 60
Регистрация: 24.12.2009
Пользователь №: 1332

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(kvak @ 5.5.2010, 4:22) *
for (int index = 0, int c =0 ; index != -1; index++, c++ )
{
...
}


Это не код а феерическая фигня. Откройте для себя break; Или объясните, для какой цели используется int index и почему не хватает одного int c.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 5.5.2010, 12:34
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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;


И туда же еще переменную для проверки длины результирующего буфера можно добавить. :)

Сообщение отредактировал BRE - 5.5.2010, 12:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.5.2010, 12:44
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kvak, проблема тут:
            for (int index = 0; index != -1; index++ ) {
            qDebug() << "index =" << index;
            index = Engine.indexOf(vxod[a], index);
            summary[a] += c;
            c++;            
        }
ты управляющую переменную цикла (index) в теле цикла меняешь, это опасно. И в данном случае, скормив программе произвольный файл, она всегда равна НУЛЮ
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.5.2010, 15:06
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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;
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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. А я все-таки заставил работать это дело сам :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, 23:50
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
  опции профиля:
сообщение 6.5.2010, 6:22
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 5.5.2010
Пользователь №: 1690

Спасибо сказали: 1 раз(а)




Репутация:   0  


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


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.5.2010, 6:34
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Здесь разница в том, что в первом случае переменная index после тела цикла видна (доступна) не будет, а во втором будет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 23:06