「これはヤバかったな」という遅刻エピソード

perlでは以下のように2つの戻り値が可能ですが、C言語では
それができるのでしょうか?
my (ret1, ret2) = test1();

よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

A 回答 (5件)

C言語から遠く離れた者ですが、



>>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています

これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。
    • good
    • 0

構造体を戻り値で返す方法でまったく問題ないのですがこの場合変数のコピーが行われます。


大きな構造体の場合はコピー処理の時間がもったいないので結局引数にポインタを渡す方法を使う事が多いですね。
#include <stdio.h>
#include <string.h>

typedef struct {
int n;
double d;
char s[10];
} DATA;

void func(DATA* d)
{
d->n = 123;
d->d = -4.56e10;
strcpy(d->s, "test");
}

int main(void)
{
DATA data;

func(&data);
printf("%d %g %s\n", data.n, data.d, data.s);
return 0;
}
    • good
    • 2

一つの関数で戻す値が二つある場合、その二つの戻り値には密接な関連があると考えられるので、


これを構造体として一つにまとめるのは十分妥当だと思われます。

その場合も構造体をコピーして戻すのではなく、あらかじめ確保した変数へのポインタを引き数で渡して、
その内容を書き換えるという手法が一般的だと思います。

そして戻り値はエラーコードを戻すために利用する。
    • good
    • 0

こんなサンプルで体感してみてください。



#include <stdio.h>
#include <string.h>

typedef struct {
int n;
double d;
char s[10];
} DATA;

DATA func(void)
{
DATA d;

d.n = 123;
d.d = -4.56e10;
strcpy(d.s, "test");
return d;
}

int main(void)
{
DATA data;

data = func();
printf("%d %g %s\n", data.n, data.d, data.s);
return 0;
}
    • good
    • 0

戻り値を複数返すことは不可能ですが、


構造体でパックにして戻り値にすることは簡単です。

#include <stdio.h>

typedef struct {
  int a;
  int b;
} Test_t;

// 戻り値が構造体な関数
Test_t GetTest( void )
{
  Test_t Test = { 10, 20 };
  return Test;
}

int main( void )
{
  Test_t Test = GetTest();
  printf("%d %d", Test.a, Test.b ); //構造体の中身を表示
  return 0;
}
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報