ページ 11

引数を用いる関数の戻り値について

Posted: 2010年6月24日(木) 02:18
by NN
初めまして。
いつもお世話になっております。
非常に初歩的だと思われる質問をさせていただきます。

題名にもあるように、引数を用いる関数の作成に挑戦しています。
まずは、以下の関数を見ていただければと思います。
extern int fanctionB( int X, int Y );

void fanctionA(){
    fanctionB( i , j );
    fanctionB( k , l );
}

int fanctionB( int X, int Y ){
    if( X ){
        Y++;
    }
    else
        Y = 0 ;

    return 0 ;
}
ここで、何をしたいかというと、fanctionBを用いて、i,j,k,lの値を変化させたいと考えています。
具体的にはiが0でないときに、jをふやして、そうでないときに、jを0にもどす。
同じ様に、kが0でないときに、lをふやして、そうでないときに、lを0にもどす。
という風にしたいのですが、単純に、XやYがi,j,k,lに代入されていません。
これはfanctionBによって変化したX,Yを代入するには、fanctionBを実行した直後に
i=X,j=Y;などをかかないといけないのでしょうか?

いわゆる「行って来た値を、変化させて返してくる」という関数はどのように作成すればよろしいのでしょうか?
何か良いサンプルなどや解決法を教えていただければ幸いです。

以上になります。
お手数をお掛けしますが、ご教授いただければと思います。

Re:引数を用いる関数の戻り値について

Posted: 2010年6月24日(木) 02:30
by y
functionBで返す値を0にしているところをYにして、
戻り値をそれぞれjやlに代入すればOKです。

以下、ほんの一例です。
extern int fanctionB( int X, int Y );

void fanctionA(){
    j = fanctionB( i , j );
    l = fanctionB( k , l );
}

int fanctionB( int X, int Y ){
    if( X ){
        Y++;
    }
    else
        Y = 0 ;

    return Y ;
}
赤い部分が変更箇所です。
NNさんの書いたfunctionBは、恐らく引数のYを変えれば元のjやlも変わるのではないかという考えだと思います。
しかし引数というものは、基本的に値渡し(変数の中身をコピーするだけ)なので、jとYは中身が同じでも全く異なる変数となります。

Re:引数を用いる関数の戻り値について

Posted: 2010年6月24日(木) 03:35
by フリオ
 
一応突っ込み、
fanction ではなく function です。

>fanctionBを用いて、i,j,k,lの値を変化させたいと考えています。
 ポインタで渡してやれば出来ます。C++なら、参照で渡す方法もあります。
#include <stdio.h>

void func(int *a, int *b)
{
    *a = 1;
    *b = 2;
}

int main(void)
{
    int x = 0, y = 0;
    
    printf("x == %d, y == %d\n", x, y);
    func(&x, &y);
    printf("x == %d, y == %d\n", x, y);
    return 0;
}
 

Re:引数を用いる関数の戻り値について

Posted: 2010年6月24日(木) 05:13
by NN
>yさん
ありがとうございました!
冷静に考えれば、この関数は、iとkは返す必要がありませんでしたね。。。

>フリオさん
まさかのスペルミス! ずっと気づいていなかったです。。。ショック。。。
なるほど。そのような記述をすれば、複数の値を返すことができるのですね!
ありがとうございました!