ページ 11

複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 22:41
by sn
こんにちは。質問です。

コード:

color.r = 255;
color.g = 255;
color.b = 255;
このように入力していたものを

コード:

color.r = GetColorAll(255, 255, 255);
という風に、関数1つにまとめて表現したいのですが、
肝心のGetColorAllの関数をどうやって作ればいいのかがよくわかりません。
どうすればよいでしょうか。よろしくお願いします。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 22:44
by softya(ソフト屋)
color.r = GetColorAll(255, 255, 255);
ではなく
color = GetColorAll(255, 255, 255);
だと思いますが、colorの構造体をGetColorAllの戻り値とすればよいだけです。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 22:55
by 初級者
こういうことでしょうか。

コード:

#include <stdio.h>

typedef struct {
    unsigned char r;
    unsigned char g;
    unsigned char b;
} Color;

Color GetColorAll(unsigned char r, unsigned char g, unsigned char b)
{
    Color c;

    c.r = r, c.g = g, c.b = b;
    return c;
}

void GetColorAll_2(Color *c, unsigned char r, unsigned char g, unsigned char b)
{
    c->r = r, c->g = g, c->b = b;
}

int main(void)
{
    Color c, d;

    c = GetColorAll(32, 64, 128);
    printf("r=%d, g=%d, b=%d\n", c.r, c.g, c.b);

    GetColorAll_2(&d, 33, 65, 129);
    printf("r=%d, g=%d, b=%d\n", d.r, d.g, d.b);
    return 0;
}

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 22:58
by softya(ソフト屋)
そういう事です。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 23:15
by sn
ありがとうございます。理解できました。

ところでcolor構造体の要素がr,g,b,aの4つである場合、

コード:

COLOR_t GetColorAll(int r, int g, int b){
	COLOR_t temp;
	temp.r = r;
	temp.g = g;
	temp.b = b;
	return temp;
}
[code]
としてしまうと、GetColorAllを用いた際に要素aの値が壊れてしまいます。

GetColorAll処理を行う前後で要素aの値を保持するには、
初心者さんがおっしゃるように、GetColorAll_2の手法を用いるしかないのでしょうか。
出来ればcolor = GetColorAll...的な書き方にしたいので、悩ましい所です。
よろしくお願いします。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 23:27
by softya(ソフト屋)
C++でならメソッドで柔軟な書き方も出来ますが、C言語の構造体だと良い方法が無いですね。

引数として、aも必ず渡すぐらいしか手がないと思います。
color = GetColorAll(r,g,b,color.a);
って感じです。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 23:30
by sn
ちょっとコード部分修正です。初心者さんと構造体名同一にしました。

コード:

Color GetColorAll(int r, int g, int b){
Color temp;
temp.r = r;
temp.g = g;
temp.b = b;
return temp;
}

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月12日(木) 23:32
by sn
そうなのですか。ありがとうございます。
color = GetColorAll(r,g,b,color.a);
のやり方は確かにあまり綺麗じゃないですが、面白い方法ですね。参考になりました。

またよろしくお願いします。

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月13日(金) 07:23
by beatle
C++を使っていいならこんな感じに書けます

コード:

#include <iostream>

using namespace std;

struct Color
{
	int a;
	int r;
	int g;
	int b;

	Color(int a, int r, int g, int b)
		: a(a), r(r), g(g), b(b)
	{}

	Color(int r, int g, int b)
		: a(-1), r(r), g(g), b(b)
	{}

	Color& operator=(const Color& rhs)
	{
		if (rhs.a >= 0)
		{
			a = rhs.a;
		}
		r = rhs.r;
		g = rhs.g;
		b = rhs.b;

		return *this;
	}
};

int main()
{
	Color c1(100, 10, 20, 30);
	Color c2(40, 50, 60);

	cout << "c1 (" << c1.a << "," << c1.r << "," << c1.g << "," << c1.b << ")" << endl;
	cout << "c2 (" << c2.a << "," << c2.r << "," << c2.g << "," << c2.b << ")" << endl;

	c1 = c2;

	cout << "c1 (" << c1.a << "," << c1.r << "," << c1.g << "," << c1.b << ")" << endl;
	cout << "c2 (" << c2.a << "," << c2.r << "," << c2.g << "," << c2.b << ")" << endl;
}
実行結果
c1 (100,10,20,30)
c2 (-1,40,50,60)
c1 (100,40,50,60)
c2 (-1,40,50,60)

Re: 複数の変数代入操作を1つの関数にまとめて行う方法

Posted: 2012年7月13日(金) 07:29
by beatle
補足:よりsnさんが書きたい方法に近づけたバージョン

コード:

int main()
{
	Color c1(100, 10, 20, 30); // アルファチャネルが100の色を生成
	cout << "c1 (" << c1.a << "," << c1.r << "," << c1.g << "," << c1.b << ")" << endl;
	c1 = Color(40, 50, 60); // color = GetColorAll...的な書き方
	cout << "c1 (" << c1.a << "," << c1.r << "," << c1.g << "," << c1.b << ")" << endl;
}