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

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

ただいまの
回答率

87.94%

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,061

score 26

このプログラムで宣言されている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;
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+3

こんには。

char *list[100]; 

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/30 11:30

    if(list[rand()100%] == 0) //(0~99の中でランダムに数字を出してそれが0のとき)

    みたいな感じにやりたいです。具体的に記述したものは削除してしましました...

    キャンセル

  • 2016/09/30 11:49

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

    dskn1121さんがやりたいことと、状況を整理して、
    質問をし直したほうがいいような気がします。

    キャンセル

  • 2016/09/30 11:59

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

    キャンセル

+1

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);

ってすればいいと思う。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

char *list[101];


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/30 11:28

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

    キャンセル

  • 2016/09/30 11:33

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

    キャンセル

  • 2016/10/03 07:56

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る