No.1ベストアンサー
- 回答日時:
戻り値では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; /* 適当に値をセット */
}
必要な宣言等は、適宜行って下さい。
配列を受け取るポインタの宣言には人それぞれ好みがあるのですが、私は「単なる変数のアドレスを受け取るのではない」ということを主張している、この方法を取っています。
ちなみに「構造体なら返せる」と言って、配列メンバを持った構造体を返してる人を見たことがありますが、できたとしてもこんな方法はやめましょう。
ありがとうございます。
ところで、厚かましい質問かも知れませんが、私はいつも
double f(double x)
{
double out_put;
out_put = x * x;
return(out_put);
}
という関数で、
y = f(x);
のようにしてyに出力させています。
この形が慣れ親しんでいるのですが、このような形で複数の出力はできないでしょうか。
あと、お時間があれば、もうひとつお願いします。
私はいつも、mainを
void main(void)
としているのですが、これらのvoidとはどういう意味なのでしょうか。
よろしくお願いします。
No.4
- 回答日時:
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やクラスライブラリを使ったっていいんですけどね)
ありがとうございました。
うーん、わたしにはちょっと複雑です。(^^;
「->」あたりからよくわからないです…
安直にはいかないということがわかっただけでも、収穫でした。
No.3
- 回答日時:
お勧めはしませんが、こんなやり方もあります。
#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;
}
呼び出された関数の内部でメモリーを確保して、そのポインタを返しています。
一般的には、そのポインタはプログラム内で明示的に解放する必要があります。
ありがとうございます。(^O^)
良し悪しがわからないので、お勧めしないなら、あまり使ってみる気がしないです…(^^;
ともかくありがとうございました。
No.2
- 回答日時:
> 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 * というポインタ型が出てきたりもするので、参考書などで調べてみるとよいでしょう。
この回答への補足
「お礼する」で登録してしまったので、こちらに書きます。
>> y = f(x);
>の形で複数の値を返すことはできません。
そんなうまい話はないですね。(^^;
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 電車・路線・地下鉄 JR東日本は女性を積極的に車掌登用しているようですが、安全性は大丈夫なんでしょうか? 6 2022/11/03 17:27
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- Excel(エクセル) 表に書いてある単語を1つの行に重複させないで書き出したい。 複数の列行にそれぞれ職種が入力されている 6 2022/05/25 04:49
- Visual Basic(VBA) ExcelVBAで配列2つを結合させて重複アドレスを削除したいです 3 2023/04/25 15:31
- JavaScript 助けてください‼︎ javascriptで質問があります。 配列を定義して、 29342、45342 3 2022/06/26 22:06
- Excel(エクセル) Excel2019 列と列(2列)の数値の重複を調べたい 1 2023/05/11 13:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
if と配列の組み合わせ
-
(int *)の意味
-
複数桁10進数の*桁目だけを抽出...
-
足して100になるような乱数のア...
-
ラップ関数とはどんなものですか?
-
エラー 添字が付けられた値が、...
-
C言語で三目並べをするプログラ...
-
円周率
-
return 1L
-
ポインタを使って関数の値の...
-
商と剰余を同時に求める(C言語)
-
PowerShellがうまくいかない
-
C言語 エラーの原因がわからな...
-
数字列を3桁ごとにカンマで区切...
-
質問です 下記のコードを分かり...
-
アスタリスクで正方形
-
systemの戻り値を取得する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報