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

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

ただいまの
回答率

87.80%

c言語 Segmentation fault

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,323

score 43

Ubuntsuと、Armadilloを使っています。
画像一覧でページ移動をしたいと思っています。
画像は適当に画面サイズに合う800×480のサイズの名前が0.bmpから11.bmpまで用意しました。
1ぺージに画像は6枚表示します。
実行ファイルがある場所から画像を読み込むのですが、この時、6枚より1枚多くなるたびにページ数を増やしていきたいと考えています。

すみません。なんていえばいいか分かりませんので、
例えば、12枚あり、最初の6枚(1ページ目)を見ている時は、「1/2」
残り7~12枚(2ページ目)を見ている時は「2/2」
と表示したいです。

ここで、

void draw_bmp_small(unsigned int *pfb2, int x0, int y0, int w, int h, unsigned char *bmpdata2)
{
    int x = x - x0;
    int y = y - y0;
    int padding = (w * 3) % 4;
    unsigned char r, g, b;

    // 開始位置から画像を表示
    // 最も下のラインから始まり、最も上のラインに向かって1ラインずつ画像データを格納
    for(y = h - 1; y >= 0; y -= 3){
        for(x = 0; x < w; x += 3){
            // 1pixelから、R,G,B各色のカラーデータを取得
            r = bmpdata2[x * 3 + y * (w * 3 + padding) + 2];
            g = bmpdata2[x * 3 + y * (w * 3 + padding) + 1];
            b = bmpdata2[x * 3 + y * (w * 3 + padding) + 0];
            // LCDにカラーデータを表示
            // サイズ260×156
            pfb2[(h - 1 - (y * 13 / 40 + y0)) * SCREENWIDTH + (x * 13 / 40 + x0)] = RGB888(r, g, b);
        }
    }
}
// 計6枚の画像を読み込む
    for(y = 1; y >= 0; y--){
        for(x = 0; x <= 2; x++){

            // 文字列filenameに*.bmpを格納
            sprintf(filename,"%d.bmp", name_new);

            // BTN_PICTUREでタッチされた画像の名前表示(**.bmp)
            picname[no] = name_new;

            // 引数に設定されたファイルをオープン
            // オープンに失敗した場合はエラーで終了
            if ((fd_pic[name_new] = open(filename, O_RDONLY)) < 0) {
                perror("open(file)");
                //return 1;
                continue;
            }

            // ビットマップヘッダに、画像データを読み込む
            // 読み込みに失敗した場合はエラーで終了
            if (read(fd_pic[name_new], &bmp, sizeof(bmp)) != sizeof(bmp)){
                perror("read(file)");
                return 1;
            }

            // 画像データから、ビットマップファイルのヘッダ情報のデータサイズを引いた値を
            // データサイズとして、メモリ領域を確保
            datasize = bmp.fh.bfSize - sizeof(bmp);
            // 必要なメモリ領域を確保できない場合はエラーで終了
            if (!(bmpdata2 = malloc(datasize))){
                perror("malloc");
                return 1;
            }

            // 確保したメモリ領域に画像データを読み込む
            // 読み込みに失敗した場合はエラーで終了
            if (read(fd_pic[name_new], bmpdata2, datasize) != datasize){
                perror("read(file)");
                free(bmpdata2);
                return 1;
            }

            //画像ファイルをクローズ
            close(fd_pic[name_new]);

            // LCDに縮小した画像を表示
            draw_bmp_small(pfb2, xx[x], yy[y], bmp.ih.biWidth, bmp.ih.biHeight, bmpdata2);

            name_new++;
            no++;
        }
    }

画像を縮小して6枚表示するプログラムの一部です。
画像縮小表示、最初の0~5.bmpまでの表示はうまくできましたが、次の6枚(6~11.bmp)を表示しようとページを移動し、「// 計6枚の画像を読み込む」という方を再度実行すると6枚表示するのですが、Segmentation faultになって終了してしまいます。
調べると、確保された領域以外を参照したことによるエラーだと出て、プログラムを見直してみましたがよく分かりませんでした。
このプログラムだけではわからないかもしれませんが、気づいたことがあったら教えてください。
お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

fd_pic[name_new]をたびたび指定してますが、fd_picの長さって6になってませんか?

FILEポインタ見るときにこれを配列にしている意味自体ないっちゃないんですが(毎回開いてビットマップにコピーした後クローズするわけですし)ソースみるにこれはfd_pic[no]が想定された作りじゃないですか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/15 14:41

    haru666さんのおっしゃっている通りでした。
    大変助かりました。
    分かりずらい質問でしたが回答していただきありがとうございました。

    キャンセル

  • 2016/12/15 14:43

    ゲームみたいなもので楽しかったですよ:-D
    解決したのなら良かったです

    キャンセル

0

二つ目のソースの

// BTN_PICTUREでタッチされた画像の名前表示(**.bmp)
picname[no] = name_new;


この、no は何が入っていますか? きちんと設定していますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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