ページ 1 / 1
複数の変数代入操作を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;
}