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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

6回答

8699閲覧

整数とポインタ型を比較する方法

dskn1121

総合スコア26

C

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2016/09/30 01:05

編集2016/09/30 02:22

*このプログラムで宣言されているchar list[100]を一番下にあるif文の条件の中にいれたいのですがsegmentation faultとエラーが出てしまいうまくいきません。
どなたかこの問題を解決できる方はいませんか。
ちなみにプログラムの中身はだいぶ省略しています。
コメントアウトされたもの(LEDが~~となっているもの)も気にしないでください。


///////////////////////////////////////////////////////

int i;
int n; //試行回数

char *list[100]; //確率設定 list[0]="WiiU"; //1% for(i=1;i<=2;i++){ //2% list[i]="3DS"; } for(;i<=6;i++){ //4% list[i]="ジバニャン"; } for(;i<=13;i++){ //7% list[i]="ガンプラ"; } for(;i<=23;i++){ //10% list[i]="キャシャーン"; } for(;i<=33;i++){ //10% list[i]="ポッター"; } for(;i<=45;i++){ //12% list[i]="爪切り"; } for(;i<=66;i++){ //21% list[i]="骨"; } for(;i<=99;i++){ //33% list[i]="出川"; }

///////////////////////////////////////////////////

/ここのif文の条件の中に
cher
list[100]をいれたいのですがうまく動作しません*/

/条件はcharをnに代入してifの中にいれたり、n = list[rand()%100]; と入力してifの中に入れたりしましたがいきませんでした。/

if(n==0){ draw_image(IMAGE_0,810,0); }else if (n==1 && n<=2){ draw_image(IMAGE_1,0,500); }else if (n>=3 && n<=6){ draw_image(IMAGE_2,0,1000); }else if (n>=7 && n<=13){ draw_image(IMAGE_3,810,500); }else if (n>=14 && n<=23){ draw_image(IMAGE_4,810,1000); }else if (n>=24 && n<=33){ draw_image(IMAGE_5,1620,0); }else if (n>=34 && n<=45){ draw_image(IMAGE_6,1620,500); }else if (n>=46 && n<=66){ draw_image(IMAGE_7,1620,1000); }else if (n>=67 && n<=99){ draw_image(IMAGE_8,0,1500); }else{ break;

}


訂正しました。質問の仕方が悪く申し訳ございません。
また、なにかご指摘あったら教えてください。

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

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

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

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

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

guest

回答6

0

ベストアンサー

こんには。

char *list[100];

と定義されてますね。Cの配列は0から始まりますので、list[0]~list[99]まで確保されてます。
つまり、list[100]は存在しないため、未定義なアドレスを指していると思います。そこをアクセスすると不正アクセスで落ちます。

解決するには、list[100]をアクセスしないか、char *list[101];とし、かつ、list[100]も適切な領域へのポインタを設定することと思います。

投稿2016/09/30 01:27

Chironian

総合スコア23272

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

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

0

具体的にエラーが出る記述を記載した方がよくないでしょうか?
「*list[100]をいれたい」と書かれても曖昧で解釈が色々できてよくわかりません。

投稿2016/09/30 01:16

HiroshiWatanabe

総合スコア2160

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

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

0

int n;に文字列を代入していることで、
4byteより大きいデータを入れようとしたとき、nが入っているメモリの直後の領域が
無理やり書きかえられる事になりそう。
文字は半角英数字でも一文字で1byteだからほとんどの場合でnが入っているメモリを飛び出すよね。

すると、nの入っているメモリの直後に、関数のアドレスとか、main関数のアドレスとかが入っていたら
そこが書き換えられて、関数の呼び出しに失敗して、止まってしまうんじゃないかな?

見る限り、n=rand()%100; とすれば、他には問題はなさそう...

あと、プログラムの発想自体があまりよくないです。
同じデータが何個も格納されているのは無駄です。

ランダムな値nに対し、結果は
"WiiU";
"3DS";
"ジバニャン";
"ガンプラ";
"キャシャーン"
"ポッター";
"爪切り";
"骨";
"出川"
の9通りしかないのに100個分のデータを保存するのに必要なメモリを使っていることが
無駄だということです。
もっというと、一度文字列に直して、その文字列がいつ使われるのかもわかりません...
プログラムを作るうえでは、処理の順番を変えることで効率的にメモリを使えたり、
処理が速くなったりすることがあります。

どうしても文字列がほしいなら、
僕だったら、

char list[9][100] = {
"WiiU",
"3DS",
"ジバニャン",
"ガンプラ",
"キャシャーン",
"ポッター",
"爪切り",
"骨",
"出川"
};

int n = rand()%100;

int get_idx(int n) {
if (n == 0) {
return 0;
}
else if (n <= 2) {
return 1;
}
else if (n <= 6) {
return 2;
}
else if (n <= 13) {
return 3;
}
else if (n <= 23) {
return 4;
}
else if (n <= 33) {
return 5;
}
else if (n <= 45) {
return 6;
}
else if (n <= 66) {
return 7;
}
else if (n <= 99) {
return 8;
}
}

として、list[get_idx(n)]で文字列を決めるかな.
上で
else if(n<=2)としていて、else if(n>=1 && n<=2)としていないのは
直前にn==0を処理し終わっているからそれよりも下に処理が進む時点で
確実にn>=1ではあるから書かなくてもいい。
そのぶん判定するためのコードを減らし、判定するための時間を減らすことが出来るから書かない。
これが処理をする順番を考えるっていうことのひとつかな~

...
文字列とかよく考えてみたらいらなかった...
nに対応する画像を表示させたいだけだった...って思ったら、

void p_image(int n){
if(n==0){
draw_image(IMAGE_0,810,0);
}else if (n<=2){
draw_image(IMAGE_1,0,500);
}else if (n<=6){
draw_image(IMAGE_2,0,1000);
}else if (n<=13){
draw_image(IMAGE_3,810,500);
}else if (n<=23){
draw_image(IMAGE_4,810,1000);
}else if (n<=33){
draw_image(IMAGE_5,1620,0);
}else if (n<=45){
draw_image(IMAGE_6,1620,500);
}else if (n<=66){
draw_image(IMAGE_7,1620,1000);
}else if (n<=99){
draw_image(IMAGE_8,0,1500);
}
}

でp_image(n);

ってすればいいと思う。

雰囲気からして、小学生か中学生、せいぜい高校生かな?
もしそうだとしたらプログラミングやろうとしているだけで凄いことだよ!
最初は難しいだろうけど、めげずにがんばれ!

投稿2016/10/02 19:47

編集2016/10/03 10:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

list は要素数100個の配列じゃないですか?
もし、
*list[100]
として、何かしようとしているなら、それは 101個目の要素です。
それは、配列の範囲外ですから、叱られます。(正確には、叱られて当然です)

やろうとしていることと、私の回答は合ってますか?
それとも的外れですか?

投稿2016/09/30 01:29

nob.

総合スコア711

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

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

dskn1121

2016/09/30 01:53

0~99の中で乱数を発生させて 0なら~~ 1~2なら~~ とさせようとしているのでnob.さんの言ってるとおりです。 これをif文の中の条件にいれるにはどうしたらいいでしょうか。
nob.

2016/09/30 02:10

101番目、すなわちlist[100]をどうしようとされているのですか? 101番目が必要なら、101個の要素を確保してください つまり、下のPineMatsuさんの回答と同じです。 ひょっとして、 if (*list[100] == '\0') のようなことをしようとしているのですか? dskn1121さんは具体的には、どのように記述されたのですか? その行そのものを、その通りに教えてください。
dskn1121

2016/09/30 02:30

if(list[rand()100%] == 0) //(0~99の中でランダムに数字を出してそれが0のとき) みたいな感じにやりたいです。具体的に記述したものは削除してしましました...
nob.

2016/09/30 02:49

list[] を使って何をしようとされているのでしょうか? 質問の表題は「整数とポインタの比較」となっていますが、 *list[100]と何かを比較しようとされているのですか? *list[100]は「ポインタ」じゃありません。charです。 dskn1121さんがやりたいことと、状況を整理して、 質問をし直したほうがいいような気がします。
dskn1121

2016/09/30 02:59

すいません、そうしますね・・・お騒がせしました。
guest

0

参考になるかはわかりませんが。
いろいろ調べてみました。
http://minus9d.hatenablog.com/entry/20140121/1390314231
http://ochiailab.blogspot.jp/2012/06/segmentation-fault.html

投稿2016/09/30 10:34

DAEichan

総合スコア29

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

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

0

list[100]を使いたい、つまりlist[0]~list[100]まで使いたいのであれば、

C

1char *list[101];

と宣言する必要があります。

投稿2016/09/30 02:02

PineMatsu

総合スコア3579

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

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

dskn1121

2016/09/30 02:05

list[100]なら0~99まで使えるんですよね?その方向でやっています。
PineMatsu

2016/09/30 02:11

そうですよ。理解されてるじゃないですか。 C言語の配列宣言は個数を指定します。アクセスする場合は、0から始まるので100個と指定した場合は、[0]~[99]までになります。 プログラムのコメントで /*ここのif文の条件の中に*list[100]をいれたいのですがうまく動作しません*/ と書いてありますが、どういう風に条件を入れたのか具体的に書いてもらえたらそれについてアドバイスできます。 今の質問の仕方だと、他の方や私のような回答になってしまうと思います。
dskn1121

2016/09/30 02:24

追記しました。これでわかりますか?なにかあったら教えてください
PineMatsu

2016/09/30 02:28

言い方が悪かったかな? コメントではなくエラーが発生した時の具体的なC言語の構文を書いてください。
dskn1121

2016/09/30 02:33

一応コンパイルは通るんですがsegmentation faultとでてプログラムが終了します。 すいませんプログラムがあまり得意ではないので変に答えてしまっていたら申し訳ないです。
PineMatsu

2016/10/02 22:56

「segmentation fault」と出た時のソースがあればもう少しお答えできると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問