質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

443閲覧

キーボードから入力した値を要素数にしたい

h_proc

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/30 14:07

キーボードから入力した値を要素数にしたいです。以下のようなコードを書いたのですが、6行目(のyo)にエラーが出てしまいます。原因と対処法を教えていただきたいです。よろしくお願いいたします。

c

1#include <stdio.h> 2 3int main(void) { 4 printf("Please diceid n(the length of an array).\n"); 5 int yo = 0 ; 6 scanf("%d", &yo); 7 int dt[yo] = { 1 }; 8 for (int i = 0; i < yo; i++) { 9 dt[i] = i; 10 printf("%d\n", dt[i]); 11 } 12 return 0; 13}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fu7mu4

2018/12/31 02:01

コンパイラや実行環境を記載してください。コンパイラの種類によってできること、できないことが異なります。 また、エラー出力をコピーペーストしてください。
guest

回答5

0

ベストアンサー

宣言時に配列要素数を変数で指定できるのは、一部のコンパイラの拡張機能です。

対策案1:上限を決めて、大きめに宣言しておく
対策案2:malloccallocで、動的にメモリー領域を確保してそれを配列として使う

投稿2018/12/30 14:22

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/12/31 04:24

回答ありがとうございます。
guest

0

Cの配列長は固定です。なので、malloc()等でメモリを確保して使いましょう。

「追記」

c

1/** 2 teratail:166610 3 */ 4#include <stdio.h> 5#include <stdlib.h> 6 7int main(void) 8{ 9 printf("Please diceid n(the length of an array).\n"); 10 int yo = 0; 11 scanf("%d", &yo); 12// int dt[yo] = { 1 }; 13 int *dt = (int *)malloc((size_t)yo * sizeof(int)); 14 // 15 for (int i = 0; i < yo; i++) { 16 dt[i] = i; 17 printf("%d\n", dt[i]); 18 } 19 free(dt); 20 // 21 return 0; 22}

結果

text

1usr ~/Project/test % ./a.out 2Please diceid n(the length of an array). 35 40 51 62 73 84

投稿2018/12/30 14:17

編集2018/12/30 23:47
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/12/31 04:24

ありがとうございます。
guest

0

c

1#include <stdio.h> 2#include <stdlib.h>//malloc関数呼び出し用 3 4int main(void){ 5 printf("Please diceid n(the length of an array).\n"); 6 int yo=0; 7 scanf("%d",&yo); 8 int *dt = (int*)malloc(sizeof(int)*yo);//int型の配列をyo個作成 9 int i; 10 for(i=0;i<yo;i++){ 11 dt[i] = i; 12 printf("%d\n",dt[i]); 13 } 14 free(dt); 15 getch(); 16 return 0; 17}

malloc関数を使って配列を動的確保すれば目的の処理は実装できます。

※コンパイラはgccで動作確認済み。

投稿2018/12/30 23:24

編集2018/12/30 23:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/12/30 23:42

linux環境のclangでは、getch()は、ワーニング&リンクエラーになります。また、 -Weverything指定しているので(size_t)yoとキャストしないとワーニングになります。 :t.c:9:40: warning: implicit conversion changes signedness: 'int' to 'unsigned long' [-Wsign-conversion] int *dt = (int*)malloc(sizeof(int)*yo);//int型の配列をyo個作成 ~^~ t.c:16:5: warning: implicit declaration of function 'getch' is invalid in C99 [-Wimplicit-function-declaration] getch(); ^ t.c:16:5: warning: this function declaration is not a prototype [-Wstrict-prototypes] 3 warnings generated. /tmp/t-947b14.o: 関数 `main' 内: t.c:(.text+0x5a): `getch' に対する定義されていない参照です clang-8: error: linker command failed with exit code 1 (use -v to see invocation) u
guest

0

提示されたソースコードをそのままgcc -Wall -W オプションでコンパイルした場合
空白行を含めて7行目に以下のエラーが生成されます。

hoge.c:7:12: error: variable-sized object may not be initialized int dt[yo] = { 1 }; ^~ 1 error generated.

このエラーメッセージは可変長配列 dt をこの方法では初期化できないことを意味しています。
callocを使用して初期化してください。

なお、「エラーメッセージが表示されます」といった質問では、読者にはわからないので、エラーメッセージエラーメッセージを質問にコピペしてください。(要約はしないでください)

投稿2018/12/30 17:16

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/12/31 04:23

回答ありがとうございます。こちらの説明不足で申し訳ございません。
guest

0

gcc使っているなら、これでいけます。

c

1int dt[yo];

投稿2018/12/30 14:43

shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問