ある変数に何かある値を設定する際にユーザ定義関数を作成・使用する場合に、 まずは関数内部で生成(計算)した値をその関数の戻り値にして設定対象変数に代入することを考えます。 「まずは」というのは、この作成指針で不都合が生じた場合には別の指針を検討することを意味します。 例えばint型変数xに、 乱数を設定する際にユーザ定義関数myRandを作成・使用する場合に、 まずは
int myRand(void){
int result;
/***乱数を計算してresultに設定するプログラム***/
return result;
}
のように関数myRandの内部で生成した値resultを戻り値にして、main関数などで
int x=myRand();
のように関数myRandの戻り値をint型変数xに代入することを考えます。そしてこの指針で目的を達成できるので別の指針を検討する必要はありません。
一方で、1回の関数呼び出しで配列の全要素に何かある値を設定するためのユーザ定義関数を作成・使用する場合には、 設定対象配列をユーザ定義関数の引数にします。 このとき、ユーザ定義関数内部で生成(計算)した値を戻り値にして 設定対象配列に代入することは考えません。 例えば数学ではベクトル値関数があり、, とすると、のように、5次元ベクトルを入力としてが何か5次元ベクトルを生成し、それをに代入することができます。 しかしながら、C言語では
/***何か関数fの定義***/
double x[5], y[5];
/***何かxの要素の設定***/
y=f(x);
のように書くことはできません。 その理由を説明して下さい。
上の問題を教えてもらえますでしょうか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
今は構造体の値返しは可能になりましたが、それ以前の話
関数から返る値はどこにあるか?
アセンブラベースで考えます
アキュムレータレジスタ(386系なら EAX RISC系ならR0) が関数の返り値を
置く場所であると決められました
レジスタ渡しです(レジスタ返しと言うべきか?)
レジスタには 整数か浮動小数点が1個しか入りません(bit幅は、、、)(ポインタの実態は整数です)
サブルーチンの呼ぶ側/呼ばれる側の関係をこう決めたのです
呼ばれる側としては、最後に何かやった結果はアキュムレータレジスタに入る事が大部分なので
返値受け渡し領域にコピーすると言う無駄な手間が省けます
・標準の返値受け渡し方式としてレジスタ渡しを採用する
・1個のレジスタで受け渡せる値は1個である
以上により Cの関数は、「返値を1個しか返せない」のです
→ この標準では出来ない事を開発したのが構造体の値返しですね
No.4
- 回答日時:
回答になっていないこと予めお詫びします
Cはコンパイラ言語ですので、最終的には機械語に翻訳されます。
何か疑問に思ったら、質問する前にそのコードをコンパイルして機械語になった(アセンブラ言語になった)コードを読まれることおすすめします。
そうすれば、この種の疑問も、質問者さんが納得する形での説明が見つかる気がしています。
No.3
- 回答日時:
#2 に勝手に補足すると, この質問文のケースの場合 ISO 規格では
構造体の中に配列を作る
ことで回避できなくもない.
たとえば
typedef struct {
double element[5];
} DArray5;
とかやればこの DArray5 はコピーできて, その結果として配列の全要素が勝手にコピーされる.
No.2
- 回答日時:
malloc された領域に格納して、その領域のポインタを返せばいいだけです。
代替手段があるのに面倒な処理をするようなことはCはしません。
ANSIになってからは、コンピュータの処理能力が上がったので、
構造体のような大きなものも返却値にできるようにはなりましたが、
配列はサポートしていません。
そんなのが欲しいなら、ほかの言語なり、自作言語なりで、
自由に作ってくださいというのが、Cのスタンスです。
C++などの、vector などを使ってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
2番目の最大値を求める
-
char型配列をint型に代入するには
-
C言語の課題が出たのですが自力...
-
callocで二次元配列を作成する...
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
c言語
-
fclose()でセグメンテーション違反
-
MFCのCArrayを使った二次元配列
-
c言語 構造体
-
C言語の2次元配列 容量が大き...
-
C言語 構造体でつまずいています
-
int i, int i[1];
-
配列の要素数に変数を入れたい...
-
C言語から質問です。
-
C言語で重複組合せを全列挙
-
コンボボックスでデフォルト値...
-
char gyou[1024];でcharの表現...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報