코드 구현에서 무엇이 문제인지 잘 모르겠습니다.

4바이트 기준으로 최하바이트부터 차례대로 red, green, blue를 입력받아서 rgb를 만드는 함수 MakeRGB는 구현을 했는데요. MakeRGB값을 토대로 다시 red,green,blue 각각을 따로 구하는 함수(GetREd, GetGreen, GetBlue)에서는 처음 MakeRGB를 만들때 입력했었던 값들을 그대로 구하지 않습니다. 무엇이 문제일까요?.. (참고로 Visual Studio 2019를 사용중입니다.) 멘트해주시면 너무나도 감사하겠습니다. :slight_smile:

#include <stdio.h>
int MakeRGB(int, int, int);
int GetRed(int);
int GetGreen(int);
int GetBlue(int);

int main(void)
{
	int red, green, blue;

	printf("RED GREEN BLUE 값을 입력하시오( 0 ~ 255사이값 : ");
	scanf_s("%d %d %d", &red, &green, &blue);
	while (getchar() != '\n');

	printf("RGB의 값은 %X입니다.\n" ,MakeRGB(red, green, blue));
	printf("RGB의 Red : %d, Green : %d, Blue : %d입니다.\n", GetRed(MakeRGB),
		GetGreen(MakeRGB), GetBlue(MakeRGB));

	return 0;
}

//함수명 : MakeRGB
//기능 : Red,Green, Blue를 인자로 바아서 4바이트 크기의 RGB 색상을 만드는 함수
int MakeRGB(int x, int y, int z)
{
	int red = 0, green = 0, blue = 0, rgb = 0;
	
	red = x % 256; // 0 ~ 255 사이의 값
	green = y % 256; // 0 ~ 255 사이의 값
	blue = z % 256; // 0 ~ 255 사이의 값

	rgb = red | green << 8 | blue << 16;

	return rgb;

}

//함수명 : GetRed
//기능 : RGB로부터 Red값을 구하는 함수
int GetRed(int x)
{
	//int red = 0;

	x = x & 0xFF;

	return x;
}

//함수명 : GetGreen
//기능 : RGB로부터 Green값을 구하는 함수
int GetGreen(int x)
{
	//int green = 0;

	x = x >> 8;
	x = x & 0xFF;

	return x;
}

//함수명 : GetBlue
//기능 : RGB로부터 Blue값을 구하는 함수
int GetBlue(int x)
{
	//int blue = 0;
	x = x >> 16;
	x = x & 0xFF;

	return x;
}
1 Like
printf("RGB의 Red : %d, Green : %d, Blue : %d입니다.\n", GetRed(MakeRGB),
		GetGreen(MakeRGB), GetBlue(MakeRGB));

GedRed 들에 넘겨야할 인자가 뭔지 확인해보세요. MakeRGB 는 리턴값이 int 인 함수잖아요.

printf("RGB의 값은 %X입니다.\n" ,MakeRGB(red, green, blue));

위에는 제대로 했네

1 Like
int GetBlue( int rgb )
{
    return  rgb >> 16 & 0xFF;
}

처럼 한줄로 쓰면됩니다.

red = x % 256

red = x & 0xFF 랑 같은 말이죠?
동일한 역할이 & 0xFF 랑 % 256 으로 다르게 표현하는 코드는 확실히 통일한쪽 보다 가독성이 나쁩니다.

1 Like

그러니까 제대로 할꺼면

int red, green, blue, rgb;
...
rgb = MakeRGB( red, green, blue );
printf( "RGB의 값은 %X입니다.\n" , rgb );
printf( "RGB의 Red : %d, Green : %d, Blue : %d입니다.\n", GetRed( rgb ), GetGreen( rgb ), GetBlue( rgb ) );

처럼 하셨어야 하죠.
변수 저장이 불필요한 곳엔 변수를 사용하고,
정작 필요한 곳엔 변수를 만들지 않아 함수를 매번 호출하고 있다는거죠.

1 Like