crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Ключевые слова Qt/C++, Где посмотреть?
ufna
  опции профиля:
сообщение 5.10.2010, 9:51
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Считаю все равно философию goto устаревшей и слишком узкой )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.10.2010, 10:04
Сообщение #12


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(ufna @ 5.10.2010, 10:51) *
Считаю все равно философию goto устаревшей и слишком узкой )
Рискну выложить на суд общественности такой код (написан не мной, но в проекте используется). Считаю использование goto в данном случае оправданным
int HostGraph::createKey()
{
    int iKey=0;
    forever {
        m1:
        ++iKey;
        foreach(HostItem* na, m_lsHosts) {
            if (na->m_iSelfKey == iKey) goto m1;
        }
        foreach(FolderItem* fa, m_lsFolders) {
            if (fa->m_iSelfKey == iKey) goto m1;
        }
        return iKey;
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.10.2010, 10:09
Сообщение #13


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


не знаю, что делают forever и foreach

но ВСЕГДА можно обойтись без goto :)

если foreach - это перебор, то проще сделать

if(... find(...) )continue;

соответственно, forever - заменить на while(1){}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.10.2010, 10:16
Сообщение #14


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


igor_bogomolov,
я согласеня с Алексей1153,
m_lsHosts, m_lsFolders - рискну предположить, что контейнеры, тогда циклы

foreach(HostItem* na, m_lsHosts) {
            if (na->m_iSelfKey == iKey) goto m1;
}

foreach(FolderItem* fa, m_lsFolders) {
            if (fa->m_iSelfKey == iKey) goto m1;
}

ни к чему
тут goto даже всей своей сволочной натуры не показывает он заменяет continue и всё!

читал у Лафоре и еще где-то что оправдать использование goto можно лишь при большушем уровне вложенности если требуется выйти на сразу несколько уровней вверх. Сам не пробовал и не собираюсь такого городить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.10.2010, 10:24
Сообщение #15


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(kwisp @ 5.10.2010, 13:16) *
если требуется выйти на сразу несколько уровней вверх. Сам не пробовал и не собираюсь такого городить

такое встречается редковато, но выход я находил в выделении кода в функцию, из которой можно выйти return. Все нужные параметры передаются по ссылке - даже думать практически не надо, как это сделать :) Заодно и автоматически разгружается загромождённый код и разделяются сущности
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.10.2010, 10:24
Сообщение #16


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(kwisp)
тут goto даже всей своей сволочной натуры не показывает он заменяет continue и всё!
continue здесь не подойдёт

Алгоритм использует последовательный перебор целых чисел начиная с нуля и проверяет его уникальность последовательным сравнением ключей (na->m_iSelfKey, fa->m_iSelfKey) в контейнерах объектов хостов (m_lsHosts) и папок (m_lsFolders). Если число уникально, то алгоритм останавливается.


Цитата(Алексей1153)
но ВСЕГДА можно обойтись без goto :)
С этим я не спорю. Я думал у вас разговор о том, когда использование goto может быть оправданным. В выше приведенном примере оно мне кажется оправданным :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.10.2010, 10:25
Сообщение #17


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(igor_bogomolov @ 5.10.2010, 13:24) *
В выше приведенном примере оно мне кажется оправданным

а мне не кажется, а кроме того - сразу стало видно, что можно оптимизировать (ускорить) поиск :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.10.2010, 10:30
Сообщение #18


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(igor_bogomolov @ 5.10.2010, 11:24) *
continue здесь не подойдёт

подойдёт, буду спорить. если убрать цикл foreach с заменой на find всё подходит великолепно

какой тип контейнера используется?

Цитата(Алексей1153 @ 5.10.2010, 11:25) *
Алгоритм использует последовательный перебор целых чисел начиная с нуля и проверяет его уникальность последовательным сравнением ключей (na->m_iSelfKey, fa->m_iSelfKey) в контейнерах объектов хостов (m_lsHosts) и папок (m_lsFolders). Если число уникально, то алгоритм останавливается.

т.е. если числа нет в обоих контейнерах то останавливается. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 5.10.2010, 10:39
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

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




Репутация:   11  


Вот так и знал, что начнется спор про goto, самого подмывало написать, но удержался. У человека же после ваших споров в голове каша будет.

QMainWindow, большинство современных авторов считают что goto вредно, потому что с его помощью легко наделать логических ошибок в коде. Иногда в отдельных случаях его применение дает выгоду, но это скорее исключение из правила.
Поэтому на начальных этапах изучения языка считай что оператора goto нет. Со временем и опытом придет понимание где его можно использовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.10.2010, 10:45
Сообщение #20


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(kwisp @ 5.10.2010, 11:27) *
подойдёт, буду спорить.
Я говорю про конкретную реализацию алгоритма, описание которого привел после. Там continue не подойдет
Цитата(kwisp @ 5.10.2010, 11:27) *
т.е. если числа нет в обоих контейнерах то останавливается. :)
Ага. А если есть хоть в одном, выходит по goto и начинает поиск для следущего числа

Цитата(kwisp @ 5.10.2010, 11:27) *
какой тип контейнера используется?
QList<HostItem*> m_lsHosts;
Цитата(kwisp @ 5.10.2010, 11:27) *
если убрать цикл foreach с заменой на find всё подходит великолепно
Контейнер хранит указатели, поэтому qFind не подойдет. Представь что ты не можешь изменить HostItem и FolderItem. И не можешь использовать find. Попробуй изменить алгоритм только внутри функции HostGraph::createKey(). Сможешь написать его короче и красивее? :) Я только это имел в виду :)

Цитата(Sokoloff)
QMainWindow, большинство современных авторов считают что goto вредно, потому что с его помощью легко наделать логических ошибок в коде. Иногда в отдельных случаях его применение дает выгоду, но это скорее исключение из правила.
Поэтому на начальных этапах изучения языка считай что оператора goto нет. Со временем и опытом придет понимание где его можно использовать.
+500
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 22.12.2024, 20:33