こんにちは。質問です。
このように入力していたものを
という風に、関数1つにまとめて表現したいのですが、
肝心のGetColorAllの関数をどうやって作ればいいのかがよくわかりません。
どうすればよいでしょうか。よろしくお願いします。
複数の変数代入操作を1つの関数にまとめて行う方法
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
color.r = GetColorAll(255, 255, 255);
ではなく
color = GetColorAll(255, 255, 255);
だと思いますが、colorの構造体をGetColorAllの戻り値とすればよいだけです。
ではなく
color = GetColorAll(255, 255, 255);
だと思いますが、colorの構造体をGetColorAllの戻り値とすればよいだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
こういうことでしょうか。
#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;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
そういう事です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
sn
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
ありがとうございます。理解できました。
ところでcolor構造体の要素がr,g,b,aの4つである場合、
ところでcolor構造体の要素がr,g,b,aの4つである場合、
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
C++でならメソッドで柔軟な書き方も出来ますが、C言語の構造体だと良い方法が無いですね。
引数として、aも必ず渡すぐらいしか手がないと思います。
color = GetColorAll(r,g,b,color.a);
って感じです。
引数として、aも必ず渡すぐらいしか手がないと思います。
color = GetColorAll(r,g,b,color.a);
って感じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
そうなのですか。ありがとうございます。
color = GetColorAll(r,g,b,color.a);
のやり方は確かにあまり綺麗じゃないですが、面白い方法ですね。参考になりました。
またよろしくお願いします。
color = GetColorAll(r,g,b,color.a);
のやり方は確かにあまり綺麗じゃないですが、面白い方法ですね。参考になりました。
またよろしくお願いします。
Re: 複数の変数代入操作を1つの関数にまとめて行う方法
C++を使っていいならこんな感じに書けます
実行結果
c1 (100,10,20,30)
c2 (-1,40,50,60)
c1 (100,40,50,60)
c2 (-1,40,50,60)
#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つの関数にまとめて行う方法
補足:よりsnさんが書きたい方法に近づけたバージョン