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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sn

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

#1

投稿記事 by sn » 13年前

こんにちは。質問です。

コード:

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

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

color.r = GetColorAll(255, 255, 255);
ではなく
color = GetColorAll(255, 255, 255);
だと思いますが、colorの構造体をGetColorAllの戻り値とすればよいだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初級者
記事: 200
登録日時: 15年前

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

#3

投稿記事 by 初級者 » 13年前

こういうことでしょうか。

コード:

#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つの関数にまとめて行う方法

#4

投稿記事 by softya(ソフト屋) » 13年前

そういう事です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sn

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

#5

投稿記事 by sn » 13年前

ありがとうございます。理解できました。

ところで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...的な書き方にしたいので、悩ましい所です。
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

C++でならメソッドで柔軟な書き方も出来ますが、C言語の構造体だと良い方法が無いですね。

引数として、aも必ず渡すぐらいしか手がないと思います。
color = GetColorAll(r,g,b,color.a);
って感じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sn
記事: 5
登録日時: 13年前

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

#7

投稿記事 by sn » 13年前

ちょっとコード部分修正です。初心者さんと構造体名同一にしました。

コード:

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

sn
記事: 5
登録日時: 13年前

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

#8

投稿記事 by sn » 13年前

そうなのですか。ありがとうございます。
color = GetColorAll(r,g,b,color.a);
のやり方は確かにあまり綺麗じゃないですが、面白い方法ですね。参考になりました。

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#9

投稿記事 by beatle » 13年前

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)

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#10

投稿記事 by beatle » 13年前

補足:より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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る