OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

関数の配列はできないでしょうか。

  • すぐに回答を!
  • 質問No.138798
  • 閲覧数39
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 74% (166/222)

ひとつの関数で、出力を配列のように複数させたいのですが、できないでしょうか。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル12

ベストアンサー率 75% (398/526)

戻り値では1つの値しか返せないので、引数に配列のポインタを渡し、関数内で値をセットするという方法を取ります。

int main(void)
{
  int i, array[10];
  func(array);      /* 配列のアドレスを渡す */
  for (i = 0; i < 10; i++)
    printf("%d:%d\n", i, array[ i ]);
  return 0;
}

void func(int p[ ])    /* pは配列のアドレスを受け取るポインタ */
{
  int i;
  for (i = 0; i < 10; i++)
    p[ i ] = i * i;   /* 適当に値をセット */
}

必要な宣言等は、適宜行って下さい。
配列を受け取るポインタの宣言には人それぞれ好みがあるのですが、私は「単なる変数のアドレスを受け取るのではない」ということを主張している、この方法を取っています。

ちなみに「構造体なら返せる」と言って、配列メンバを持った構造体を返してる人を見たことがありますが、できたとしてもこんな方法はやめましょう。
お礼コメント
lucky111

お礼率 74% (166/222)

ありがとうございます。
ところで、厚かましい質問かも知れませんが、私はいつも

double f(double x)
{
double out_put;
out_put = x * x;
return(out_put);
}

という関数で、

y = f(x);

のようにしてyに出力させています。
この形が慣れ親しんでいるのですが、このような形で複数の出力はできないでしょうか。
あと、お時間があれば、もうひとつお願いします。
私はいつも、mainを

void main(void)

としているのですが、これらのvoidとはどういう意味なのでしょうか。
よろしくお願いします。
投稿日時 - 2001-09-20 20:26:56
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.2
レベル12

ベストアンサー率 75% (398/526)

> y = f(x); の形で複数の値を返すことはできません。返したい値が2つか3つ程度であれば、 int main(void) {   int a, b;   func(&a, &b);   printf("%d, %d\n", a, b);   return 0; } void func(int *x, int *y) { ...続きを読む
> y = f(x);
の形で複数の値を返すことはできません。返したい値が2つか3つ程度であれば、

int main(void)
{
  int a, b;
  func(&a, &b);
  printf("%d, %d\n", a, b);
  return 0;
}

void func(int *x, int *y)
{
  *x = 10;
  *y = 20;
}

のようにして、値をセットするのが普通です。

> void main(void)
main関数は、終了時にシステムに終了コードを返すべきなので、戻り型をint宣言するのが正しい宣言方法です。(引数はvoidでもOKです。)

で、このvoidというのは、戻り値や引数が「ない」ことを示すために使う型です。
void型自体は、関数プロトタイプくらいでしか見ることはないでしょう。(まれにvoidキャストを使うことはありますが。)
メモリ確保などを行う場合、void * というポインタ型が出てきたりもするので、参考書などで調べてみるとよいでしょう。
補足コメント
lucky111

お礼率 74% (166/222)

「お礼する」で登録してしまったので、こちらに書きます。

>> y = f(x);
>の形で複数の値を返すことはできません。

そんなうまい話はないですね。(^^;
ありがとうございました。
投稿日時 - 2001-09-22 09:36:58
お礼コメント
lucky111

お礼率 74% (166/222)

ありがとうございました。
これからは
int main(void)
で行こうとおもいます。
投稿日時 - 2001-09-22 09:36:08
  • 回答No.3
レベル13

ベストアンサー率 24% (357/1463)

お勧めはしませんが、こんなやり方もあります。 #include <stdlib.h> int * func() {  int *p;  p = (int*)malloc(sizeof(int[2]));  p[0] = 10;  p[1] = 20; } int main(void) {  int *a;  a = func();  printf(&q ...続きを読む
お勧めはしませんが、こんなやり方もあります。

#include <stdlib.h>
int * func()
{
 int *p;
 p = (int*)malloc(sizeof(int[2]));
 p[0] = 10;
 p[1] = 20;
}

int main(void)
{
 int *a;
 a = func();
 printf("%d, %d\n", a[0], a[1]);
 free((void*)a);
 return 0;
}

呼び出された関数の内部でメモリーを確保して、そのポインタを返しています。
一般的には、そのポインタはプログラム内で明示的に解放する必要があります。
お礼コメント
lucky111

お礼率 74% (166/222)

ありがとうございます。(^O^)
良し悪しがわからないので、お勧めしないなら、あまり使ってみる気がしないです…(^^;

ともかくありがとうございました。
投稿日時 - 2001-09-22 09:43:47
  • 回答No.4
レベル9

ベストアンサー率 40% (43/105)

No.3の方のソースを元にしてみました。 struct int_array { int size; int *pi; }; struct int_array *func() { struct int_array *p = (struct int_array *)malloc(sizeof(struct int_array)); int *pil = (int*)malloc( ...続きを読む
No.3の方のソースを元にしてみました。

struct int_array {
int size;
int *pi;
};

struct int_array *func()
{
struct int_array *p = (struct int_array *)malloc(sizeof(struct int_array));
int *pil = (int*)malloc(sizeof(int[2]));
pil[0] = 10;
pil[1] = 20;

p->pi = pil;
p->size = 2;
return p;
}

int main(void)
{
struct int_array *p = func();

/* 処理 */

free(p->pi);
free(p);

return 0;
}

こんな感じでどうでしょうか。

C++ならば、struct int_arrayはクラスにしてデストラクタで領域を解放させるべきですが。
(さらに言えばSTLやクラスライブラリを使ったっていいんですけどね)
お礼コメント
lucky111

お礼率 74% (166/222)

ありがとうございました。
うーん、わたしにはちょっと複雑です。(^^;
「->」あたりからよくわからないです…

安直にはいかないということがわかっただけでも、収穫でした。
投稿日時 - 2001-09-22 09:47:27
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ