goto vs break & continue
    , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Правила раздела:
  | Страницы: (32) « Первая ... 12 13 [14] 15 16 ... 31 32 ( Перейти к последнему сообщению ) | 
    goto vs break & continue
    , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
  | 
         
         
         
          
           Сообщ.
           #196
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Та неважно, что. И не надо ничего писать, разве что проиллюстрировать идею, например. Как в архитектуру заложить сохранение/восстановление состояний? В конце-концов любая нормальная игра это умеет. Но вот как сие реализовать в своём приложении?   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #197
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Переформулируй, не понял ответа твоего, вернее могу не так ответить, так как не понял смысла того что ты написал. В общем переформулируй вопрос. Ок, в последний раз. Во фразе говорится об одном из критериев, соответствие коду которому говорит о том, что код стоит вынести в отдельный метод. Об одном из. Это не значит, что не существуют других критериев, и, как следствие - не значит, что большой код, написанный один раз, я разбивать не буду.  | 
    
| 
         
         
         
          
           Сообщ.
           #198
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
| 
         
         
         
          
           Сообщ.
           #199
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
| 
         
         
         
          
           Сообщ.
           #200
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Qraizer @  Та неважно, что. И не надо ничего писать, разве что проиллюстрировать идею, например. Как в архитектуру заложить сохранение/восстановление состояний? В конце-концов любая нормальная игра это умеет. Но вот как сие реализовать в своём приложении? Это любопытно, но при чем тут goto?   Добавлено Цитата KILLER @  Забавно     | 
    
| 
         
         
         
          
           Сообщ.
           #201
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          рискну предположить, что тройной for можно заменить while с ручным инкрементом - необходимость в гоуту отпадёт   
        
          | 
    
| 
         
         
         
          
           Сообщ.
           #202
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Да там вообще просто переделать инициализацию i,j,k и все. То, что с goto читабельнее - вопрос спорный  
        
          | 
    
| 
         
         
         
          
           Сообщ.
           #203
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
        ![]() ![]() int i = j = k = 0; restorePrevious(&i, &j, &k); while(i<10) {  while(j<10)  {   while(k<10)   {    k++;   }   j++; k = j;  }  i++; j = i; k = j; } оно?  | 
    
| 
         
         
         
          
           Сообщ.
           #204
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          _lcf_, тут еще вопрос с масштабированием. Решение Qraizer'а позволяет сохранять много всякой херни, загружать много всякой херни и работать дальше. Как бы в твоем случае мы будем чуть ли не с каждой переменной вручную разбираться.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #205
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
        ![]() ![]() for (int i = isInit ? initValue : 0; i < 10; i++)  for (int j = isInit ? initValue : i; j < 10; j++)   for (int k = isInit ? initValue : j; k < 10; k++) компилятор сиё оптимизирует?  | 
    
| 
         
         
         
          
           Сообщ.
           #206
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          У них разные initValue  
        
        По поводу оптимизации - надо мерить. Добавлено Пока получается что-то вроде того: ![]() ![]() int i = 0, j = 0, k = 0; if (restore(&i, &j, &k))     goto resume; for(i = 0; i < 10; ++i) {   for (j = i; j < 10; ++j) {     for(k = j; k < 10; ++k) { resume:      // ...     }   } } vs ![]() ![]() int i = 0, j = 0, k = 0; restore(&i, &j, &k); for(; i < 10; ++i, j = i, k = j) {   for (; j < 10; ++j, k = j) {     for(; k < 10; ++k) {       // ...     }   } } vs ![]() ![]() int init_i = 0, init_j = 0, init_k = 0; bool is_init = restore(&init_i, &init_j, &init_k); for(int i = is_init ? init_i : 0; i < 10; ++i) {   for (int j = is_init ? init_j : i; j < 10; ++j) {     for(int k = is_init ? init_k : j; k < 10; ++k) {       // ...     }   } } Мне кажется, что вариант с goto понятнее... Хотя второй тоже неплох, на мой взгляд.  | 
    
| 
         
         
         
          
           Сообщ.
           #207
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  _lcf_, тут еще вопрос с масштабированием. Решение Qraizer'а позволяет сохранять много всякой херни, загружать много всякой херни и работать дальше. Как бы в твоем случае мы будем чуть ли не с каждой переменной вручную разбираться. Э-м… Так там же тоже с каждой переменной вручную разбираются: ![]() ![]()   ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i);   ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j);   ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k); // ...      ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good();      ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good();      ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good();  | 
    
| 
         
         
         
          
           Сообщ.
           #208
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата korvin @  Цитата D_KEY @  _lcf_, тут еще вопрос с масштабированием. Решение Qraizer'а позволяет сохранять много всякой херни, загружать много всякой херни и работать дальше. Как бы в твоем случае мы будем чуть ли не с каждой переменной вручную разбираться. Э-м… Так там же тоже с каждой переменной вручную разбираются: ![]() ![]()   ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i);   ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j);   ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k); // ...      ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good();      ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good();      ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good(); Ну это только в плане сохранения/загрузки. А так тебе придется еще в логике учитывать. В данном случае - по особому работать со счетчиками циклов.  | 
    
| 
         
         
         
          
           Сообщ.
           #209
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата D_KEY @  Мне кажется, что вариант с goto понятнее... O_O' Чем он понятней? Только тем, что там выход из трёх циклов? Ну так достаточно весь этот код вынести из main в отдельную процедуру и использовать return. В goto-версии циклы начинаются с нуля. Если вдруг при чтении файла что-то пойдёт не так и загрузятся неправильные значения счётчиков (ниже нуля), то получим баг. Добавлено Цитата D_KEY @  Ну это только в плане сохранения/загрузки. А так тебе придется еще в логике учитывать. В данном случае - по особому работать со счетчиками циклов. При чтении их инициализирующих значений извне, с ними нужно по-особому работать. Чтобы это было явно отражено в коде.  | 
    
| 
         
         
         
          
           Сообщ.
           #210
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Есть еще вариант со switch  
        
        Не проверял, мог опечататься ![]() ![]() int i = 0, j = 0, k = 0; switch (restore(&i, &j, &k)) case 0:   for(i = 0; i < 10; ++i) {     for (j = i; j < 10; ++j) {       for(k = j; k < 10; ++k) { default:          // ...       }     }   } } Вряд ли кто-то скажет, что он понятнее варианта с goto     |