2012-04-02 26 views
2

上記の関数が既に戻り値を持っている場合、関数からローカル変数をmainに戻すにはどうすればよいですか?申し訳ありませんが、私は可能な限り客観的にするよう努めています。私の場合だけではありません。Cの複数の変数を関数からmainに渡すにはどうすればよいですか?

具体的には:subtotalという機能があります。 2つのカウント変数があります。そのうちの1人がreturnと返されました。もう1つは私のmain()機能で使用できるようにする必要があります。

編集:明確にする:

function something() { 
    float counter = 0.0; 
    int someOtherVar = 0; 

    // the work 

    return someOtherVar; 
} 

は、私は何をしたいmaincounterフロートを渡すことです。

答えて

9

にパラメータとして追加の戻り値へのポインタを渡します関数。

int foo(int *anotherOutParam) 
{ 
    *anotherOutParam = 1; 
    return 2; 
} 

そして、それを呼び出すためには:

int ret1, ret2; 
ret1 = foo(&ret2); 
//do something with ret2 

多くの場合、structにすべての戻り値を梱包の@マットの提案が好ましいです。

+0

ありがとう、私は私の質問にいくつかの説明を追加しました。 – eveo

+0

私の答えのコードは、基本的にあなたの説明で説明している内容を実装しています。 'int * anotherOutParam'を' float * counter'に置き換えれば完了です。 –

+0

問題は 'float * count;'と定義されていますが、これは問題ありませんが、 'count + = anotherVar; 'を実行しようとすると、このエラーが発生します:'無効なオペランドからバイナリ+(float * 'ダブル') '。 – eveo

11

戻り値をすべてstructに入れて返します。

#include <stdio.h> 

struct myret { 
    int total; 
    int count; 
}; 

struct myret foo(void) 
{ 
    struct myret r; 
    r.total = 42; 
    r.count = 2; 
    return r; 
} 

int main(void) 
{ 
    struct myret r = foo(); 
    printf("%d %d\n", r.total, r.count); 
    return 0; 
} 

また、「その他の」戻り値のポインタを使用してください。

int foo(int *other) 
{ 
    if (other) 
    *other=42; 
    return 1; 
} 

int main(void) 
{ 
    int a = 0; 
    int b = foo(&a); 
    ... 
} 

あなたはまた、あなたの関数に構造体へのポインタを渡すことによって、両方を組み合わせて、あなたの関数がでていることを埋めることができます:

#include <stdio.h> 

struct myret { 
    int total; 
    int count; 
}; 

int foo(struct myret *r) 
{ 
    if (r) { 
     r->total = 42; 
     r->count = 2; 
    } 
    return 0; 
} 

int main(void) 
{ 
    struct myret r; 
    int rc = foo(&r); 
    if (rc == 0) { 
     printf("%d %d\n", r.total, r.count); 
    } 
    return rc; 
} 
+0

+1:引数リストを介して個々のパラメータを返すのは、最初の例のようにカプセル化する方がはるかにクリーンなので、通常は優先する必要があります。 –

+0

+1構造体のすべての要素が論理的に互いに関連している場合(IOW、より大きい複合型の属性)は、カプセル化された構造体を返すことになります。 –

+0

関数から複数の無関係な*項目を返すという唯一の目的のために集約型*を作成しないでください。 –

関連する問題