
要素をキーボードから入力し、できた配列をひっくり返したものを表示するという問題。
また、配列の順番を逆にする操作は関数を作らなければならない。
自分なりに考えてコードを書いてみたのですがどうしてもコンパイルできません。
<コード>
#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) {
どこを修正すべきか、またそれが不可能な場合、解答例をいただけましたら幸いです。
分かりづらくてすみません。
No.5ベストアンサー
- 回答日時:
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;
}
丁寧に回答例お答えいただき、ありがとうございます。大変感謝しております。無事、コンパイルのエラーがなくなりました。
エラー解消後、求めたい結果が得られませんでしたが、main関数とrev_intary関数のnの値を調整したところ、求めていた出力を得ることができました。
解決しました!ありがとうございます。
No.6
- 回答日時:
この程度のプログラムであれば、ChatGPTが添削してくれます。
実際、最後の「分かりづらくてすみません。」以外の質問文全文をChatGPTに入力してみたところ、私が想定する指摘を返してくれていましたのでそこそこ信頼はできると思います。是非ともそういったツールを活用してください。※よくある質問とその回答
Q. ChatGPTなどによる課題の解答作成はNGだと言われていますが?
A. ChatGPTだとダメでネット上の不特定多数の人間に回答を作らせる(「解答例をいただけましたら幸いです。」とあるため、その意図がありますよね)のがOKという道理はありません。
ありがとうございます。chatGPTを使ったことがなかったため、その発想に至りませんでした。また、課題自体はどこかに提出するものでなく、独学で遊ぶ範囲で行っていますので、やはりchatGPTの使い方を調べ、使ってみようと思います。ご親切な回答ありがとうございました。
No.4
- 回答日時:
コンパイラは 今時 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 を初期化してませんね。
まだまだ先は長い。
No.3
- 回答日時:
int n=i が間違いです。
do whileのスコープ内で変数nを再定義しているので、最初に定義した変数nにiの値が代入されません。
intを削除して、n=iにすればいいです。
No.2
- 回答日時:
No.1氏の指摘の通りですが、そもそも
void rev_intary(int v[], int n)
このときのint v[]っていう引数の型が何か理解してます?
intじゃないよ。int型の配列vの先頭を示すポインタだからね。
それとこの例題だとあらかじめ要素の数がわからない。どうやって入力された値を保持するかあらかじめ考えておかないといけない。
まともに動かすには配列を決め打ちで大目に宣言しておくか、mallocでメモリ領域を確保してそこにv[]を割り当てることになる。バッファ管理の練習にはなるかもね。rev_intary()の中でメモリ取っちゃだめだよ。main()でやらないと。
あと、変数宣言は関数の先頭のところでまとめてやるのとコメント入れる癖をつけたほうがいい。もちろん字下げもね。こんなコードでもきちんと変数宣言ブロック作ってコメント入れて字下げしておけば何が悪いか自分でわかる、っていうかこんな汚いコードレビュアーに見せたらボロカス言われるよ。
No.1
- 回答日時:
いや、これはダメだろ。
そもそもmain関数で定義されている配列vの「大きさ」を示す整数nが未定義のままだ。
結局用意する配列vも未定義のまま、となる。
Cって勝手に配列の大きさを考慮してくれてなんとかしてくれる言語じゃないんだ。
基本的なCのコンセプトに対して勘違いしてるよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語です 2 2023/10/16 01:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
(int *)の意味
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
C++でvectorにテキストファイル...
-
int型の変数値をバイト列として...
-
数字列を3桁ごとにカンマで区切...
-
「{ } で囲むだけ」は正しい?
-
C言語初心者です、、、お助けく...
-
C言語
-
ラップ関数とはどんなものですか?
-
(マルチスレッド)_beginthrea...
-
C言語でDxlibを使って3x3の奇数...
-
C言語について教えてください。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報