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

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

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

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

Q&A

解決済

5回答

2141閲覧

配列の要素数を変数にしたい

h_proc

総合スコア68

C

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

0グッド

0クリップ

投稿2018/11/25 14:04

10進数で入力された整数を2進数に直して表示させるプログラムを書いています。2で割ったあまりを配列にひとつづ入れていきたいと思い、配列の要素数を変数に設定しようとしたのですが、エラーが起きてしまいます。(7行目)

c

1#include <stdio.h> 2 3int binary(int x); 4int binary(int x) 5{ 6 int n = 0; 7 int i = 0; 8 int dt[i] = { 0 }; 9 10 n = x / 2; 11 12 for (i = 0;; i++) 13 { 14 if (n > 1) 15 { 16 dt[i] = x % 2; 17 return; 18 } 19 else 20 { 21 dt[i] = 1; 22 } 23 24 } 25 while(i >0) { 26 printf("\n", dt[i--]); 27 } 28 29} 30int main(void) 31{ 32 int N, m = 0; 33 printf("Please input data.\n"); 34 scanf("%d", &N); 35 printf("N = %d\n",N); 36 37 m = binary(N); 38 39 printf("Your input data exchanged %d.\n", m); 40 41 return 0; 42} 43

また、このエラーが訂正できたとして、このコードで2進数に変換するプログラムが完成するかどうか教えていただきたいです。

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

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

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

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

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

guest

回答5

0

ベストアンサー

int binary(int x);

何を受け取り、返すつもりでしょうか?

C言語においてはintは格納できる値の範囲が定められた符号付き整数型です。
規格上は最低でも16bitとなっており、-32768から32767
実装上は32bitな事が多いので、-2147483648から2147483647
この範囲の数値しかintには格納できません。

投稿2018/11/25 22:06

asm

総合スコア15147

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

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

h_proc

2018/11/27 13:30

回答ありがとうございます。受け取る値、返す値を自分でも把握せずにやみくもに作っていました。intが格納できるビット数が限られていることも忘れていました。もう一度作り直してみます。
guest

0

int はもともと二進数で、表示の際に printf などによって十進数に変換されているに過ぎません。

ですから変換するのであれば、'1' と '0' から成る文字列に変換すべきでしょう。

sizeof(int) * 8 が文字格納に必要な要素数で、それに終端文字 '0' の分の 1 を加えた char[sizeof(int) * 8 + 1] をバッファとし、そこに文字を埋めてください。

投稿2018/11/26 00:04

Zuishin

総合スコア28660

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

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

0

C99には一応可変長配列はあります。ただ、

C

1int i = 0; 2int dt[i] = { 0 };

となっているので、dt[0]を宣言しようとしてしまって、対応したコンパイラでもエラーになります。

投稿2018/11/25 22:25

maisumakun

総合スコア145183

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

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

maisumakun

2018/11/26 00:31

なお、「可変長」といっても長さを設定できるのは宣言のときだけで、あとから広がる機能はありません。
h_proc

2018/11/27 13:28

回答ありがとうございます。dt[0]=0となってしまっているため、コンパイラでエラーが生じているということでしょうか?対処法を考えてみます。
maisumakun

2018/11/27 13:34

配列の要素数が0、という宣言はできません。
guest

0

全然別の観点から途中まで作ってみました・・・・
ヒントになりますか?

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <limits.h> 4 5void binary(int x, char *str, int siz); 6 7void binary(int x, char *str, int siz) 8{ 9 if( siz == 0 ){ 10 return; 11 } 12 binary(x >> 1, str + 1, siz -1 ); 13 // 14 *str = "01"[x & 1]; 15} 16 17int main(void) 18{ 19 int N = 0x1248; 20 // 21 printf("N = %x\n", N); 22 // 23 char *ptr = (char *)calloc(1, 67); 24 binary(N, ptr,16); 25 puts(ptr); 26 // 27 free(ptr); 28 // 29 return 0; 30} 31

usr~/test/c % ./a.out
N = 1248
0001001001001000

投稿2018/11/26 11:01

cateye

総合スコア6851

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

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

h_proc

2018/11/27 13:25

limits.h で整数の限度を設定しているのでしょうか。書いていただいたソースコードを参考にさせていただきます。
cateye

2018/11/28 09:53

limits.hは、使っていません^^; CHAR_BIT*sizeof(int)を使うつもりで入れて消し忘れです。
guest

0

配列は定義時にサイズが決まり、あとでの変更はできません
なので、この場合は32とか64で決め打ちで配列定義しとけば用は足りると思いますが、
その他のところがいろいろ不具合があるようなので、これだけではダメですね

投稿2018/11/25 14:30

y_waiwai

総合スコア87747

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

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

h_proc

2018/11/27 13:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問