• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の、戻り値/値渡し/アドレス渡しのついて)

C言語の、戻り値/値渡し/アドレス渡しのついて

このQ&Aのポイント
  • C言語における戻り値、値渡し、アドレス渡しについて説明します。
  • ソースコードの中で、戻り値/値渡し/アドレス渡しを使用したサブの関数を作成しています。
  • 質問者は概念は理解しているが、実装に詰まってしまっているようです。助けを求めています。

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

  • ベストアンサー
回答No.2

いまは、qsort( ) に渡すcmp_u( )とcmp_d( )という関数しか作ってなくて それ以外の処理は、main( ) 内にベタに書いてあるけど、 たとえば、 四則演算するところだけを関数にして ・戻り値は 演算子が +-*/ 以外のときのエラー判定値 ・値渡しは、num1,num2,op ・アドレス渡しは、answer(関数内で代入された結果を親側で使う) としてしまうという方法はありそうですね。 関数化の別案としては、main( ) 内の前半と後半の ・入力された文字を計算して ログファイルとコンソールに出力 ・ログファイルから読み込んで並び替えてコンソールの出力 の処理をそれぞれ関数にして、 main( )から呼び出すということはできそうですが この2つの処理は独立性が高く、値渡しや アドレス渡しにして結果を戻すようなものがあまりないので、 課題の狙いとは違うような気がします。

asai555666
質問者

お礼

ありがとうございます。 凄い分かりやすかったです。

その他の回答 (1)

回答No.1

一度頭をリフレッシュしたほうがいいかも! #define MAX_LINE (1000) せっかくこれを作ったのに char sin[1000][1000]; これでは意味がなく for (i = 0;i < MAX_LINE;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } これだと、例えばMAX_LINEを実ワークより大きい値をセットしたら1発で メモリ破壊しますよ。 char sin[MAX_LINE][1000]; の用が、よかったでしょうね。 ついでに、iの値と、cntの値って、常に同じな事にも気が付いてもらえたら int cnt = 0; for (i = 0;i < MAX_LINE;i = i + 1) { このように始まっているので、 for (i=0,cnt=0;i < MAX_LINE;i++,cnt++) { ロジック上、cntが加算されない時はbreakなので、 値は常に同じになってます。 つまり、i を使わなくても、直接 i を cntとするか、 ループ後に、int cnt=i;でもいいわけです。 次の問題。 【実装したコードに、戻り値/値渡し/アドレス渡しを用いたサブの関数を作成せよ。】 これと、書かれているソースに関連性がなく、別のソースと思われます。 上に書いている物だけを言うなら、 int func1(int a) { return (a); } int func2(int *a) { return (*a); } int abcd=1234; int ret; ret=func1(1234); 値渡し ret=func1(abcd); 変数渡し(ただし関数側から見ればimmediate) ret=func2(&abcd);ポインタ渡し 返り値はすべて、1234 だけで、要件定義は満たしていると思います。 もう一つ、構造体渡しってのもあるので、一応・・・ typedef struct { int abcd; }AA; int func3(AA *a) { return (a->abcd); } AA aa; aa.abcd=1234; ret=func3(&aa); なんてのもありますが(要するに連続するメモリに名前を付けてオフセット移動してるだけ) ともあれ、質問的には、単純でシンプルに考えていい気がする。

関連するQ&A