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

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

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

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

Q&A

解決済

2回答

1851閲覧

c言語 Segmentation fault

shuppi

総合スコア47

C

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

0グッド

0クリップ

投稿2016/12/15 02:43

編集2016/12/15 02:44

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

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

ここで、

C

1void draw_bmp_small(unsigned int *pfb2, int x0, int y0, int w, int h, unsigned char *bmpdata2) 2{ 3 int x = x - x0; 4 int y = y - y0; 5 int padding = (w * 3) % 4; 6 unsigned char r, g, b; 7 8 // 開始位置から画像を表示 9 // 最も下のラインから始まり、最も上のラインに向かって1ラインずつ画像データを格納 10 for(y = h - 1; y >= 0; y -= 3){ 11 for(x = 0; x < w; x += 3){ 12 // 1pixelから、R,G,B各色のカラーデータを取得 13 r = bmpdata2[x * 3 + y * (w * 3 + padding) + 2]; 14 g = bmpdata2[x * 3 + y * (w * 3 + padding) + 1]; 15 b = bmpdata2[x * 3 + y * (w * 3 + padding) + 0]; 16 // LCDにカラーデータを表示 17 // サイズ260×156 18 pfb2[(h - 1 - (y * 13 / 40 + y0)) * SCREENWIDTH + (x * 13 / 40 + x0)] = RGB888(r, g, b); 19 } 20 } 21}

C

1// 計6枚の画像を読み込む 2 for(y = 1; y >= 0; y--){ 3 for(x = 0; x <= 2; x++){ 4 5 // 文字列filenameに*.bmpを格納 6 sprintf(filename,"%d.bmp", name_new); 7 8 // BTN_PICTUREでタッチされた画像の名前表示(**.bmp) 9 picname[no] = name_new; 10 11 // 引数に設定されたファイルをオープン 12 // オープンに失敗した場合はエラーで終了 13 if ((fd_pic[name_new] = open(filename, O_RDONLY)) < 0) { 14 perror("open(file)"); 15 //return 1; 16 continue; 17 } 18 19 // ビットマップヘッダに、画像データを読み込む 20 // 読み込みに失敗した場合はエラーで終了 21 if (read(fd_pic[name_new], &bmp, sizeof(bmp)) != sizeof(bmp)){ 22 perror("read(file)"); 23 return 1; 24 } 25 26 // 画像データから、ビットマップファイルのヘッダ情報のデータサイズを引いた値を 27 // データサイズとして、メモリ領域を確保 28 datasize = bmp.fh.bfSize - sizeof(bmp); 29 // 必要なメモリ領域を確保できない場合はエラーで終了 30 if (!(bmpdata2 = malloc(datasize))){ 31 perror("malloc"); 32 return 1; 33 } 34 35 // 確保したメモリ領域に画像データを読み込む 36 // 読み込みに失敗した場合はエラーで終了 37 if (read(fd_pic[name_new], bmpdata2, datasize) != datasize){ 38 perror("read(file)"); 39 free(bmpdata2); 40 return 1; 41 } 42 43 //画像ファイルをクローズ 44 close(fd_pic[name_new]); 45 46 // LCDに縮小した画像を表示 47 draw_bmp_small(pfb2, xx[x], yy[y], bmp.ih.biWidth, bmp.ih.biHeight, bmpdata2); 48 49 name_new++; 50 no++; 51 } 52 }

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

投稿2016/12/15 03:01

編集2016/12/15 04:09
haru666

総合スコア1591

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

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

shuppi

2016/12/15 05:41

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

2016/12/15 05:43

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

0

二つ目のソースの

C

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

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

投稿2016/12/15 02:51

tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問