1. Си / Говнокод #13490

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    void mb_sim_pix(uchar* IN, uchar* OUT, int *WH, int *bSize, int *A, int *pSize, float *threshold){
    	int pos = mb_calc_pos(A, WH, pSize);
    	int nPos;
    	int i, n;
    	int B[2];
    		
    	for(n = 0; n < 4; n++){
    		
    		switch(n){
    			case 0:
    				B[0] = A[0] + 1;
    				B[1] = A[1];
    			
    			case 1:
    				B[0] = A[0];
    				B[1] = A[1] - 1;
    			
    			case 2:
    				B[0] = A[0];
    				B[1] = A[1] + 1;
    			
    			case 3:
    				B[0] = A[0] - 1;
    				B[1] = A[1];
    		}
    		
    		if(	B[0] >= 0 && B[0] < WH[0] &&
    			B[1] >= 0 && B[1] < WH[1]){
    			nPos = mb_calc_pos(B, WH, pSize);
    			if(mb_val_pix(OUT, &nPos, pSize) == 0){
    				if(mb_sim_pack(IN, &pos, &nPos, pSize) >= *threshold){
    					for(i = 0; i < *pSize; i++) OUT[nPos + i] = IN[nPos + i];
    					mb_sim_pix(IN, OUT, WH, bSize, B, pSize, threshold);
    				}
    			}
    		}
    	}
    }

    Тоже самое через if работает, а через switch проваливается на значении 0 все итерации. Почему?

    Запостил: Stertor, 27 Июля 2013

    Комментарии (62) RSS

    • Сообщение удалено.

      Модератор
      Ответить
    • У Вас нет прав писать в данной теме.
      Ответить
    • У Вас нет прав писать в данной теме.
      Ответить
    • Даже у нас?
      Ответить
    • И у нас нету?
      Ответить
    • А смысл?
      Ответить
    • Малчааать! Что за хуйня у вас здесь творится?
      Ответить
    • Во-первых, свич внутри цикла должен заставить задуматься, а правильно ли спроектирован алгоритм.

      А во-вторых, как выглядит «тоже самое через if»?
      Ответить
      • if(n == 0){
        B[0] = A[0] + 1;
        B[1] = A[1];
        }
        else if(n == 1){
        B[0] = A[0];
        B[1] = A[1] - 1;
        }
        else if(n == 2){
        B[0] = A[0];
        B[1] = A[1] + 1;
        }
        else if(n == 3){
        B[0] = A[0] - 1;
        B[1] = A[1];
        }
        Ответить
        • Я это и подозревал...

          Дело в том, что свич в Си (и в языках, основанных по мотивам его синтаксиса) — это не совсем оператор ветвления... Это всего лишь коллекция меток. Здравствуй, вечно живой goto!

          Для того, чтобы свич работал, как в Паскале, в конце каждой ветки нужно ставить break, иначе будет «провал»: будут последовательно выполняться все строчки, расположенные ниже текущей метки.

          И напоследок возьмите картинку: http://www.tema.ru/travel/izhevsk.2001/09.jpg
          Ответить
          • Что ето значит? у меня нет прав?
            Ответить
          • Эм.. тоесть switch(n){ case 3: puts("2"); break; } и так для каждого значения?
            Ответить
            • Да. break заставит после отрабатывания кода ветки сразу перейти в конец конструкции switch(){...}, иначе без лишних проверок выполнится код всех следующих веток.
              Ответить
      • Ну в общем то работает без нареканий, всё делает правильно судя по результату. Гугл молчит, по тому и спрашиваю.
        Ответить
    • break, break, break...
      Ответить
      • Что значит ета строчка?
        Ответить
        • То, что в Си case — это не ветка оператора ветвления, это только метка. Вслед за 12-й строкой выполнится 14-я, если не разделить их волшебным словом «break». Ожидаемое Вами поведение кода реализуется так:
          case 0:
            B[0] = A[0] + 1;
            B[1] = A[1];
            break;
          case 1:
          И так далее...
          Ответить
          • В таком случае компилятор ругается что case вне switch
            Ответить
            • Если case X: за пределами конструкции switch(n) {...}, то будет ругаться, потому что не ясно, значению какого выражения соответствует этот case. А если внутри, то работать будет, куда бы case не было засунуто. Где-то даже приводили говнокод, когда case внутри ещё какой-то конструкции.

              А если ругается, нужно искать синтаксическую ошибку где-то рядом.
              Ответить
              • Ну а на вскидку глядя на код сверху видно ли синтаксическую ошибку?
                Ответить
              • А ет я туплю. пардон.
                Ответить
              • Работает с брейком, спасибо за урок.
                Ответить
                • Это в школоло уроки, а у нас тут анальная педагогия. Походка изменится на пару дней.
                  Ответить
    • Ещё месяц и их станет меньше.
      Ответить
      • Еще 35 дней...
        Ответить
        • А почему у вас бородатый язык ассоциируется со школьниками? Особый путь рашки?
          Ответить
          • бородатый язык бывает у шлифовальщиков, как твоя мама.
            Ответить
          • > бородатый язык
            Да тут не язык ассоциируется, а тот, кто выкладывает эти гк.
            Ответить
            • Так почему школьники выкладывают код на бородатом языке? По идее, все должно быть наоборот.
              Ответить
              • Видимо пытаются изучить его, но пока не особо получается.
                Ответить
                • А зачем? Почему пасцаль?
                  Ответить
                  • > Почему пасцаль?
                    Внезапно, но потому, что его проходят в школах ;)
                    Ответить
                    • Круто! Уже прогресс. А я вот в школе изучал Бейсик...
                      Ответить
                      • Когда я учился в школке, ни бейсика ни пасцаля нам не преподавали. Компов было мало и они все были под 95 винду.
                        Ответить
                        • > и они все были под 95 винду

                          Поясните этот тезис.
                          Ответить
                          • А чего его пояснять?

                            Надо вырывать языки тем, кто говорит, что работать за компом под современной виндой - сложно.
                            Ответить
                            • Всё равно ничего не понял. Итак, у меня вопросы:
                              1. Что означает «они все было под 95 винду»?
                              2. Почему это мешало преподавать Бейсик и Паскаль?
                              Ответить
                              • Это означает то, что в нашем кишлаке некому было преподавать языки программирования. Компы и то еле еле заимели.
                                Ответить
              • Потому что им внушили что си и асм - это для крутых перцев. Изучив их можно стать супер-мега-хукиром.
                Ответить
                • >>си и асм - это для крутых перцев.

                  си и асм для тех, кто любить нырять по локоть в машинное масло.
                  Для меня лично вполне хватает и дельфей
                  Ответить
    • Я вошел в него, практически не ощущая сопротивления. Мы смотрели в глаза друг другу. Внутри него было тепло, глаза его застыли на мне, он затаил дыхание, потом он потянул меня к себе и тут началось. Мы бешено двигались друг навстречу другу. Я выходил из него и входил опять. Я смотрел на все это - на то, как мой член входит в его вожделенное отверстие, поросшее нежными волосками, и это бешено возбуждало меня. Не выпуская из рук его трепещущего, горячего и твердого друга, как не выпускают поводья коня наскоку, я сжимал и подрачивал его, и он как сумасшедший пульсировал в моих руках.
      Ответить

    Добавить комментарий