プロが教える店舗&オフィスのセキュリティ対策術

要素をキーボードから入力し、できた配列をひっくり返したものを表示するという問題。
また、配列の順番を逆にする操作は関数を作らなければならない。

自分なりに考えてコードを書いてみたのですがどうしてもコンパイルできません。


<コード>
#include <stdio.h>
void rev_intary(int v[], int n) {
for (int i = 0; i < n / 2; i++) {
int t = v[i];
v[i] = v[n - i];
v[n - i] = t;
}
}
int main(void) {
int n;
int v[n];
int a = 1;
do {

int i = 0;
printf("v[%d] :", i); scanf("%d", &v[i]);
printf("要素はまだある\nはい: 1 いいえ : -1"); scanf("%d", &a);
i++;
int n = i;
} while (a == 1);
rev_intary(v[n], n);
printf("反転しました\n");
for (int j = 0; j < n; j++) {
printf("v[%d] : %d", j, v[j]);
}
return 0;
}



<エラー内容>
21:21: warning: passing argument 1 of 'rev_intary' makes pointer from integer without a cast [-Wint-conversion]
21 | rev_intary(v[n], n);
| ~^~~
| |
| int
6-9.c:2:21: note: expected 'int *' but argument is of type 'int'
2 | void rev_intary(int v[], int n) {

どこを修正すべきか、またそれが不可能な場合、解答例をいただけましたら幸いです。
分かりづらくてすみません。

A 回答 (6件)

C言語を学習中かと思いますが、可変長配列は扱わないほうが無難です。


とりあえず、vの要素数を100で確保し、100件までしか入力できないようにします。
コンパイルエラーをとりたいということなので、以下のようにしてください。
そうすれば、コンパイルエラーは取れます。
但し、実行すると期待した結果にはならないかもしれません。
その場合は、再度、質問してください。

#include <stdio.h>
void rev_intary(int v[], int n)
{
for (int i = 0; i < n / 2; i++) {
int t = v[i];
v[i] = v[n - i];
v[n - i] = t;
}
}
int main(void)
{
int n;
int v[100];
int a = 1;
int i = 0;
do {
printf("v[%d] :", i);
scanf("%d", &v[i]);
printf("要素はまだある\nはい: 1 いいえ : -1");
scanf("%d", &a);
i++;
n = i;
if (i >= 100) break;
} while (a == 1);
rev_intary(v, n);
printf("反転しました\n");
for (int j = 0; j < n; j++) {
printf("v[%d] : %d", j, v[j]);
}
return 0;
}
    • good
    • 1
この回答へのお礼

丁寧に回答例お答えいただき、ありがとうございます。大変感謝しております。無事、コンパイルのエラーがなくなりました。
エラー解消後、求めたい結果が得られませんでしたが、main関数とrev_intary関数のnの値を調整したところ、求めていた出力を得ることができました。

解決しました!ありがとうございます。

お礼日時:2024/04/11 17:28

この程度のプログラムであれば、ChatGPTが添削してくれます。

実際、最後の「分かりづらくてすみません。」以外の質問文全文をChatGPTに入力してみたところ、私が想定する指摘を返してくれていましたのでそこそこ信頼はできると思います。是非ともそういったツールを活用してください。

※よくある質問とその回答
Q. ChatGPTなどによる課題の解答作成はNGだと言われていますが?
A. ChatGPTだとダメでネット上の不特定多数の人間に回答を作らせる(「解答例をいただけましたら幸いです。」とあるため、その意図がありますよね)のがOKという道理はありません。
    • good
    • 1
この回答へのお礼

ありがとうございます。chatGPTを使ったことがなかったため、その発想に至りませんでした。また、課題自体はどこかに提出するものでなく、独学で遊ぶ範囲で行っていますので、やはりchatGPTの使い方を調べ、使ってみようと思います。ご親切な回答ありがとうございました。

お礼日時:2024/04/11 16:32

コンパイラは 今時 C11?



エラーメッセージを読みましょう。

21行目がエラーと言ってますが・・・
passing argument 1 of 'rev_intary' makes pointer from integer without a cast

警告! rev_intary の第一引数はキャストなしに整数からポインタに変換されます。

expected 'int *' but argument is of type 'int'
2 | void rev_intary(int v[], int n) {

int * 型の引数に int を渡してます。
void rev_intary(int v[], int n) {

要するに、配列型の引数に int 渡すなと言ってます。
v[n] は 配列 v の インデックス n の要素という意味だから
int型です。

それ以前に 配列サイズ n を初期化してませんね。
まだまだ先は長い。
    • good
    • 3

int n=i が間違いです。


do whileのスコープ内で変数nを再定義しているので、最初に定義した変数nにiの値が代入されません。

intを削除して、n=iにすればいいです。
    • good
    • 0

No.1氏の指摘の通りですが、そもそも



 void rev_intary(int v[], int n)

このときのint v[]っていう引数の型が何か理解してます?
intじゃないよ。int型の配列vの先頭を示すポインタだからね。

それとこの例題だとあらかじめ要素の数がわからない。どうやって入力された値を保持するかあらかじめ考えておかないといけない。
まともに動かすには配列を決め打ちで大目に宣言しておくか、mallocでメモリ領域を確保してそこにv[]を割り当てることになる。バッファ管理の練習にはなるかもね。rev_intary()の中でメモリ取っちゃだめだよ。main()でやらないと。
あと、変数宣言は関数の先頭のところでまとめてやるのとコメント入れる癖をつけたほうがいい。もちろん字下げもね。こんなコードでもきちんと変数宣言ブロック作ってコメント入れて字下げしておけば何が悪いか自分でわかる、っていうかこんな汚いコードレビュアーに見せたらボロカス言われるよ。
    • good
    • 2

いや、これはダメだろ。


そもそもmain関数で定義されている配列vの「大きさ」を示す整数nが未定義のままだ。
結局用意する配列vも未定義のまま、となる。

Cって勝手に配列の大きさを考慮してくれてなんとかしてくれる言語じゃないんだ。
基本的なCのコンセプトに対して勘違いしてるよ。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています