Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2013, 19:03   #1
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию неработает switch + for

Такая конструкция не проходит дальше case 0: все три итерации цикла, почему?
Код:
int i, n;
for(n = 0; n < 3; n++)
{
   switch(n){
         case 0:
                n+=i;
         case 1:
                n-=i;
         case 2:
                n*=i;
   }
}
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 26.07.2013, 19:20   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

i создается на стеке, а значит содержит мусор, отчего и поведение конструкции зависит от фазы луны.
Smogg вне форума Ответить с цитированием
Старый 26.07.2013, 19:47   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

при первой итерации цикла выполнятся все 3 кэйза - ты прибавишь к n мусор, потом его же отнимешь (n станет равным нулю) и умножишь ноль на мусор - n останеца равным нулю.
На следующей итерации n будет равным 1, поэтому выполняться только 2 последних кэйза.
n будет содержать [мусор в квадрате].
И дальше да, поведение зависит от фазы луны. (третьей итерации может и не быть)
rrrFer вне форума Ответить с цитированием
Старый 26.07.2013, 21:05   #4
Стертор
Заблокирован
 
Регистрация: 24.07.2013
Сообщений: 41
По умолчанию

Бог ты мой, сколько слов, неужели нельзя сказать, что нужно обнулить i?

То, что переменная создана, это ЕЩЕ НЕ ЗНАЧИТ, что она пустая (==0).
Стертор вне форума Ответить с цитированием
Старый 26.07.2013, 21:21   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Стертор Посмотреть сообщение
Бог ты мой, сколько слов, неужели нельзя сказать, что нужно обнулить i?

То, что переменная создана, это ЕЩЕ НЕ ЗНАЧИТ, что она пустая (==0).
Просто обнулить переменную i ненадостаточно.
Потому что, в итоге образуется вечный цикл:

Код:
int main()
{
    int i=0, n;  //<--- обнулили
    for(n = 0; n < 3; n++)
    {
       switch(n)
        {
             case 0: n+=i;
             case 1: n-=i;
             case 2: n*=i;
        }
    }

    //<--- сюда мы уже никогда не попадем
}
Но если вы прочитаете подробные объяснения процесса, любезно предоставленные выше, то вы сможете понять, в чем именно вы не правы.
_Bers вне форума Ответить с цитированием
Старый 26.07.2013, 21:28   #6
Стертор
Заблокирован
 
Регистрация: 24.07.2013
Сообщений: 41
По умолчанию

Гм, правда. Один ноль В Вашу пользу. Я не обратил внимание, что он обращается к счетчику цикла -совсем не гламурно.
Ну ладно-с, пущай. Просто интересно: укусит ли дракон хвост?

Последний раз редактировалось Стертор; 26.07.2013 в 21:30.
Стертор вне форума Ответить с цитированием
Старый 26.07.2013, 23:51   #7
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Пардон, я затупил и неправильно задал вопрос. Конструкцию на самом деле я хотел написать такую:
Код:
int i, n;

for(i = 0; i < 3; i++){
	switch(i){
	
		case 0:
			n = 2 + 2;
		
		case 1:
			n = 2 + 3;
		
		case 2:
			n = 2 + 4;
	}
}
Аналог того что я пытался использовать и происходило действие case 0: каждую итерацию.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 27.07.2013, 00:24   #8
Стертор
Заблокирован
 
Регистрация: 24.07.2013
Сообщений: 41
По умолчанию

Поздно, дружок:
http://govnokod.ru/13488
Стертор вне форума Ответить с цитированием
Старый 27.07.2013, 00:51   #9
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Поздно, дружок
переживу. давай по теме.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 27.07.2013, 01:05   #10
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от Стертор Посмотреть сообщение
Это я видел, конструкция сейчас другая.
Вот тебе тот аналог, рекурсивная функция для выделения совместных пикселей.
В первом случае проверка условия через if во втором через switch, в первом случае работает, во втором нет.
Вопрос - почему?

Код:
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++){
		
		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];
		}
				
		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);
				}
			}
		}
	}
}

uchar* mb_magic_wand(uchar* IN, int A[2], int WH[2], int pSize, float threshold){
	int bSize = WH[0] * WH[1] * pSize;
	uchar* OUT = malloc(bSize);
		if(OUT != NULL){
			memset(OUT, 0, bSize);
			mb_sim_pix(IN, OUT, WH, &bSize, A, &pSize, &threshold);
		}
	return OUT;
}
Код:

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);
				}
			}
		}
	}
}
do not use your brain

Последний раз редактировалось Кащей; 27.07.2013 в 01:09.
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неработает поток (С++/g++) Mesken Помощь студентам 3 18.04.2013 23:33
Неработает float..... MARTINS Помощь студентам 2 31.05.2011 12:09
cin неработает programm Общие вопросы C/C++ 4 29.12.2010 15:11
неработает USB VVkSoft Операционные системы общие вопросы 10 12.02.2010 23:25
Помогите неработает xxxNeXxxx Помощь студентам 4 04.11.2009 23:47