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

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

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

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

Q&A

1回答

1312閲覧

画像回転 C コアダンプ

ZhenZeZhang

総合スコア33

C

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

0グッド

0クリップ

投稿2020/01/13 08:10

プログラムの謎のコアダンプが出ることによりいろいろ検査したところ、謎が解決できず質問させていただきます。

コアダンプ部: image2rotate90.cの中のvoid bmp_cool内部に問題があることでコダダンプしています。

コードは以下の3つによりできています。.h と image2.c には問題が見当たりませんでした。

gcc のコマンドは $ gcc -Wall image2rotate90.c image2.c

解決したいこと:コアダンプの理由を知りたい。

いかが3組のコードです。

使用した画像はBMPを使用しているので(質問ページに乗せることに失敗したため)リンクだけ上げます。
使用画像のリンク(クリックできます)

#include <stdio.h> #include "image2.h" /* 画像処理の関数の本体 */ void bmp_cool(bmp_data_t *hd, pixel_t img[MAX_Y][MAX_X]) { pixel_t co[MAX_Y][MAX_X]; int i, j, x = hd->header.biWidth, y = hd->header.biHeight; for (i=0; i< hd->header.biHeight; i++) { /* biHeight は画像の高さ */ //縦線 for (j=0; j< hd->header.biWidth; j++) { /* biWidth は画像の幅 */// 横線 co[i][j].r =hd->img[i][j].r; co[i][j].g =hd->img[i][j].g; co[i][j].b =hd->img[i][j].b; /* hd->img[j][i].r += img[hd->header.biWidth-i ][j].r; hd->img[j][i].g += img[hd->header.biWidth-i ][j].g; hd->img[j][i].b += img[hd->header.biWidth-i ][j].b; img[hd->header.biWidth-i ][j].r = hd->img[j][i].r - img[hd->header.biWidth-i ][j].r; img[hd->header.biWidth-i ][j].g = hd->img[j][i].g - img[hd->header.biWidth-i ][j].g; img[hd->header.biWidth-i ][j].b = hd->img[j][i].b - img[hd->header.biWidth-i ][j].b; hd->img[j][i].r -= img[hd->header.biWidth-i ][j].r; hd->img[j][i].g -= img[hd->header.biWidth-i ][j].g; hd->img[j][i].b -= img[hd->header.biWidth-i ][j].b; */ } } for (i=0; i< hd->header.biHeight; i++) { /* biHeight は画像の高さ */ //縦線 for (j=0; j< hd->header.biWidth; j++) { /* biWidth は画像の幅 */// 横線 hd->img[j][i].r =co[hd->header.biWidth-i-1][j].r; hd->img[j][i].g =co[hd->header.biWidth-i-1][j].g; hd->img[j][i].b =co[hd->header.biWidth-i-1][j].b; } } hd->header.biWidth = y; hd->header.biHeight = x; } int main(void) { bmp_data_t hd; pixel_t img [MAX_Y][MAX_X]; bmp_read("in.bmp", &hd); /* in.bmp から読み込む */ bmp_cool(&hd, img); /* 処理の呼び出し */ bmp_write("out.bmp", &hd); /* out.bmp への書き出し */ return 0; }
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include "image2.h" /******************************************************* 24ビット-ビットマップデータ (BMPファイル) のファイル入出力 (制限) - 画像の横幅は4の倍数であること - リトルエンディアンにのみ対応 ********************************************************/ void bmp_read (char filename[FILENAME_MAX], bmp_data_t *hd) { FILE *fp; int i, j; /* ファイルオープン */ if ((fp = fopen(filename, "rb"))==NULL) { fprintf(stderr, "read_bmp: failed to open \"%s\"\n", filename); exit(1); } fprintf(stderr, "input file = \"%s\"\n", filename); /* ヘッダ情報の読み込み */ fread(&hd->header.bfType, sizeof(hd->header.bfType), 1, fp); fread(&hd->header.bfSize, sizeof(hd->header.bfSize), 1, fp); fread(&hd->header.bfReserved1, sizeof(hd->header.bfReserved1), 1, fp); fread(&hd->header.bfReserved2, sizeof(hd->header.bfReserved2), 1, fp); fread(&hd->header.bfOffBits, sizeof(hd->header.bfOffBits), 1, fp); fread(&hd->header.biSize, sizeof(hd->header.biSize), 1, fp); fread(&hd->header.biWidth, sizeof(hd->header.biWidth), 1, fp); fread(&hd->header.biHeight, sizeof(hd->header.biHeight), 1, fp); fread(&hd->header.biPlanes, sizeof(hd->header.biPlanes), 1, fp); fread(&hd->header.biBitCount, sizeof(hd->header.biBitCount), 1, fp); fread(&hd->header.biCompression, sizeof(hd->header.biCompression), 1, fp); fread(&hd->header.biSizeImage, sizeof(hd->header.biSizeImage), 1, fp); fread(&hd->header.biXPelsPerMeter, sizeof(hd->header.biXPelsPerMeter), 1, fp); fread(&hd->header.biYPelsPerMeter, sizeof(hd->header.biYPelsPerMeter), 1, fp); fread(&hd->header.biClrUsed, sizeof(hd->header.biClrUsed), 1, fp); fread(&hd->header.biClrImportant, sizeof(hd->header.biClrImportant), 1, fp); assert(hd->header.biHeight<=MAX_Y); assert(hd->header.biWidth<=MAX_X); /* ビットマップデータの読み込み */ for (i=0; i < hd->header.biHeight; i++) { for (j=0; j < hd->header.biWidth; j++) { fread(&hd->img[i][j].b, 1, 1, fp); fread(&hd->img[i][j].g, 1, 1, fp); fread(&hd->img[i][j].r, 1, 1, fp); } } /* ファイルクローズ */ fclose(fp); } void bmp_write(char filename[FILENAME_MAX], bmp_data_t *hd) { FILE *fp; int i, j; assert(hd->header.biHeight<=MAX_Y); assert(hd->header.biWidth<=MAX_X); /* ファイルオープン */ if ((fp = fopen(filename, "wb"))==NULL) { fprintf(stderr, "write_bmp: failed to open \"%s\"\n", filename); exit(1); } fprintf(stderr, "output file = %s\n", filename); /* ヘッダ情報の書き出し */ fwrite(&hd->header.bfType, sizeof(hd->header.bfType), 1, fp); fwrite(&hd->header.bfSize, sizeof(hd->header.bfSize), 1, fp); fwrite(&hd->header.bfReserved1, sizeof(hd->header.bfReserved1), 1, fp); fwrite(&hd->header.bfReserved2, sizeof(hd->header.bfReserved2), 1, fp); fwrite(&hd->header.bfOffBits, sizeof(hd->header.bfOffBits), 1, fp); fwrite(&hd->header.biSize, sizeof(hd->header.biSize), 1, fp); fwrite(&hd->header.biWidth, sizeof(hd->header.biWidth), 1, fp); fwrite(&hd->header.biHeight, sizeof(hd->header.biHeight), 1, fp); fwrite(&hd->header.biPlanes, sizeof(hd->header.biPlanes), 1, fp); fwrite(&hd->header.biBitCount, sizeof(hd->header.biBitCount), 1, fp); fwrite(&hd->header.biCompression, sizeof(hd->header.biCompression), 1, fp); fwrite(&hd->header.biSizeImage, sizeof(hd->header.biSizeImage), 1, fp); fwrite(&hd->header.biXPelsPerMeter, sizeof(hd->header.biXPelsPerMeter), 1, fp); fwrite(&hd->header.biYPelsPerMeter, sizeof(hd->header.biYPelsPerMeter), 1, fp); fwrite(&hd->header.biClrUsed, sizeof(hd->header.biClrUsed), 1, fp); fwrite(&hd->header.biClrImportant, sizeof(hd->header.biClrImportant), 1, fp); /* ビットマップデータの書き出し */ for (i=0; i < hd->header.biHeight; i++) { for (j=0; j < hd->header.biWidth; j++) { fwrite(&hd->img[i][j].b, 1, 1, fp); fwrite(&hd->img[i][j].g, 1, 1, fp); fwrite(&hd->img[i][j].r, 1, 1, fp); } } /* ファイルクローズ */ fclose(fp); }
#define MAX_Y 512 /* 最大画像サイズ (横方向) */ #define MAX_X 512 /* 最大画像サイズ (縦方向) */ #define LEVEL 256 /* 画素の階調 */ #define HIGH 255 /* 画素の輝度の最大値 */ #define LOW 0 /* 画素の輝度の最小値 */ typedef struct { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; unsigned int biSize; unsigned int biWidth; unsigned int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; unsigned int biXPelsPerMeter; unsigned int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } bmp_header_t; typedef struct { unsigned char r; unsigned char g; unsigned char b; } pixel_t; typedef struct { bmp_header_t header; pixel_t img[MAX_Y][MAX_X]; } bmp_data_t; void bmp_read(char filename[], bmp_data_t *bmp); void bmp_write(char filename[], bmp_data_t *bmp);

もし解決できる方がいっらしゃれば、ここでの原理を説明したサイトリンクでもいいですので理由とともに教えていただければ大変感謝しております。

ありがとうございます。

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

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

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

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

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

y_waiwai

2020/01/13 08:16

bmp_read、bmp_writeの双方の関数を実行してるところがないですが、これがコードの全部でしょうか?
ZhenZeZhang

2020/01/13 08:18

はい。確認したところ、これで全部です。  bmp_read("in.bmp", &hd); /* in.bmp から読み込む */ bmp_cool(&hd, img); /* 処理の呼び出し */ bmp_write("out.bmp", &hd); /* out.bmp への書き出し */ がその関数を使っているところです。mainの中で実行しています。
guest

回答1

0

まず、やばそーなところを。

int main(void) {

bmp_data_t hd; pixel_t img [MAX_Y][MAX_X];

このhdとimgのサイズが大きすぎるのではないかと。
この上に、

void bmp_cool(bmp_data_t *hd, pixel_t img[MAX_Y][MAX_X]) {

pixel_t co[MAX_Y][MAX_X];

これが来るので、mainと合わせて、スタックがオーバーしてしまい、アクセス違反となるんではないかと。

ちなみに、 pixel_t img[MAX_Y][MAX_X]の引数と、co変数でダブルでスタック食いますね

投稿2020/01/13 08:33

y_waiwai

総合スコア87749

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

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

ZhenZeZhang

2020/01/13 08:43

void bmp_cool(bmp_data_t *hd) { pixel_t co[MAX_Y][MAX_X]; int i, j; for (i=0; i< hd->header.biHeight; i++) { /* biHeight は画像の高さ */ //縦線 for (j=0; j< hd->header.biWidth; j++) { /* biWidth は画像の幅 */// 横線 co[i][j].r =hd->img[j][hd->header.biWidth-i-1].r; co[i][j].g =hd->img[j][hd->header.biWidth-i-1].g; co[i][j].b =hd->img[j][hd->header.biWidth-i-1].b; } } for (i=0; i< hd->header.biHeight; i++) { /* biHeight は画像の高さ */ //縦線 for (j=0; j< hd->header.biWidth; j++) { /* biWidth は画像の幅 */// 横線 hd->img[i][j].r =co[i][j].r; hd->img[i][j].g =co[i][j].g; hd->img[i][j].b =co[i][j].b; } } } int main(void) { bmp_data_t hd; pixel_t img [MAX_Y][MAX_X]; bmp_read("in.bmp", &hd); /* in.bmp から読み込む */ bmp_cool(&hd); /* 処理の呼び出し */ bmp_write("out.bmp", &hd); /* out.bmp への書き出し */ return 0; }
ZhenZeZhang

2020/01/13 08:43

回答アリアが問うございます。 まだ全部理解していないですが、ちょっと書き換えました。こうゆうことですか?
y_waiwai

2020/01/13 08:52

とりあえずは、コードを全く変えないで、変数coと、hdとimgをみんなグローバル変数にしてやってみたらどうでしょう。 #これでうまくはしるならそういうことでしょうね
ZhenZeZhang

2020/01/13 08:58

回転できました! 画像の現状は画像左半分が真っ暗なので、それを自分今から直してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問