- ベストアンサー
C言語のプログラムについての質問
- C言語のプログラミングについて質問です。入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが、うまく作動しません。
- どこがいけないのでしょうか...?教えていただきたいです。
- C言語のプログラムについて質問です。入力されたデータの配列とデータ数を渡すと、配列に格納された値を逆順にして格納し直す関数reverseを書いたのですが、うまく動作しません。どこが問題なのでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
度々失礼します。 よく考えると、最初から何も交換していなかった可能性もあリます。 少し調べてみたら、配列のままでも交換できるみたいです。 ”*”を取ってみるとか、試してみたらどうでしょう?
その他の回答 (8)
- Tacosan
- ベストアンサー率23% (3656/15482)
「エラーが出る」というなら「どんなエラーが出るのか」くらい書こうとは思わない?
補足
お返事ありがとうございます。 reverse(data, n)の文に passing argument 1 of ‘reverse’ from incompatible pointer type というようなエラーが出ました。しかし、お返事ありがとうございます。n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。 ご回答ありがとうございました。
> reverse(data, n); > > に問題があるようなエラーが出てしまうのですが dataの型はint *ですがreverseの引数の型はint **なので型が合わないためです。 reverse関数の*は不要です。
補足
お返事ありがとうございます。 n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。 ご回答ありがとうございました。
これは数学じゃないです。 パッと見、reverse()の中にあるfor文の中の > c = *data[i]; が変に見えます。int型であるdata[i]の中の値をアドレスとみてその指す先にアクセスしようとしてる?
補足
お返事ありがとうございます。 数学の分野の問題として、これを与えられたので自分は数学だと思っていました。 n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。 ご回答ありがとうございました。
- ferien
- ベストアンサー率64% (697/1085)
>reverse(data, n); > >に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができます>か…? void reverse(int *data[], int n) { int c, i; for (i = 0; i < n; i ++) { の、for文のnだけ、n/2に直せばいいと思います。 使用しているコンピュータについてはよく分からないですが、多分大丈夫だと思いますが……?
補足
お返事ありがとうございます。n/2に直しただけでやってみたら、 reverse(data, n)の文に passing argument 1 of ‘reverse’ makes pointer from integer without a cast というようなエラーが出ました。しかし、reverse関数の*をすべてとったら、正しく作動しました。 ご回答ありがとうございました。
- ferien
- ベストアンサー率64% (697/1085)
例えば、データが5個だと2回で交換が終わります。 5回だと何もしない1回と、あと残り2回で元に戻ってしまうので、 n/2で、小数点以下切り捨てるようにすればいいのでは?
補足
補足から失礼します。回答ありがとうございます。 なるほど!たしかにそうですね。 しかし、このプログラムをターミナルで実行すると、 reverse(data, n); に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができますか…?
- FT56F001
- ベストアンサー率59% (355/599)
サブルーチンreverse中のfor文の終了条件は,i<nではなくてi<n/2だと思います。
補足
補足から失礼します。回答ありがとうございます。 ただ、このプログラムをターミナルで実行すると、 reverse(data, n); に問題があるようなエラーが出てしまいます。それもおっしゃられた修正で直すことができるでしょうか…?
- ninoue
- ベストアンサー率52% (1288/2437)
reverseの中で既に交換の済んだ要素を再度交換して元に戻していませんか。
補足
補足から失礼します。回答ありがとうございます。 そうです。たしかにもどしてしまっていました。 ただ、このプログラムをターミナルで実行すると、 reverse(data, n); に問題があるようなエラーが出てしまうのですが、それもおっしゃられたところを修正することで直すことができるでしょうか…?
- himajin100000
- ベストアンサー率54% (1660/3060)
俺はC言語詳しくない。 1. http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation を参考に「ポインタの配列」なのか「配列のポインタ」なのかを明確にしてみた。 2.以下のルーチンなんだがな。 3つの要素を逆転しようとして 行われることは 0と2を交換 1と1を交換 2と0を交換 しているから、元に戻るだけなんだよ。 void reverse(int (*data)[], int n) { int c, i; for (i = 0; i < n ; i ++) { c = (*data)[i]; (*data)[i] = (*data)[n - (i + 1)]; (*data)[n - (i + 1)] = c; } } だから、半分しかやらないとか工夫すればちゃんと逆転されます http://ideone.com/taQR9
補足
補足から失礼します。 ご丁寧な回答をありがとうございます。 しかし、このプログラムをターミナルで実行すると、 reverse(data, n); に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができるでしょうか…?
補足
お返事ありがとうございます。reverse関数の*をすべてとったら、正しく作動しました。 何度も,親切なご回答をありがとうございます。 とても助かりました^^