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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

4回答

860閲覧

ソースコードのエラーが全然消えず困っています

snowman_F

総合スコア19

C

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2021/07/26 16:51

編集2021/07/26 16:55

C言語初心者です。
「5×5のBayerパターンでの色表現で適応型カラーブレーン補間法(ACPI)を使用する」という課題に詰まりました。Qt Creatorで実行するとまだ27個もエラーが出てきます。

さらっとソースを見て、適当に目に付いた間違いを簡単に教えて戴ければ幸いです(課題なので最終的な調整は自分で行います)。
どうぞよろしくお願いします。

#include <math.h> #include <stdlib.h> static void acpi1(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b); ※以下acpi4まで同様に。文字数削減のため省略 void MakeRGBData_Acpi( unsigned char* const out_r, /* R */ unsigned char* const out_g, /* G */ unsigned char* const out_b, /* B */ unsigned char const* const input_img, /* aのアドレステーブル */ int const start_x, /* 切り出し位置 x */ int const start_y, /* 切り出し位置 y */ int const size_x, /* 切り出しサイズ x */ int const size_y /* 切り出しサイズ y */ ) { int y; int const end_x = start_x + size_x; int const end_y = start_y + size_y; for (y = start_y; y < end_y; ++y) { int x; for (x = start_x; x < end_x; ++x) { int const in_pos = y * BUF_WIDTH + x; int const out_pos = (x - start_x) + (y - start_y) * size_x; unsigned char const* const bayerA = &input_img[in_pos]; unsigned int A_RED, A_GREEN, A_BLUE; unsigned int is_odd_x = x & 1; unsigned int is_odd_y = y & 1; // 入力画像のベイヤパターンは以下の通り // 0 → x // ↓ G B G B G B ・・・0行目(偶数行) // y R G R G R G ・・・1行目(奇数行) // G B G B G B ・・・2行目(偶数行) // R G R G R G ・・・3行目(奇数行) // G B G B G B ・・・4行目(偶数行) // R G R G R G ・・・5行目(奇数行) if(is_odd_x && is_odd_y) { // 処理対象画素が偶数行、偶数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のGが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Bを復元 // G R G R G // B G B G B // G R G R G // B G B G B // G R G R G acpi1(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else if(is_odd_x && !is_odd_y) { // 処理対象画素が奇数行、偶数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のBが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Gを復元 // B G B G B // G R G R G // B G B G B // G R G R G // B G B G B acpi2(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else if(!is_odd_x && is_odd_y) { // 処理対象画素が偶数行、奇数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のRが今回処理対象画素。周囲の5×5の画素の値を使って中央のG,Bを復元 // R G R G R // G B G B G // R G R G R // G B G B G // R G R G R acpi3(bayerA, &A_RED, &A_GREEN, &A_BLUE); } else { // 処理対象画素が奇数行、奇数列の場合、周囲5×5の画素は以下のベイヤパターンとなる // 下図の中央のGが今回処理対象画素。周囲の5×5の画素の値を使って中央のR,Bを復元 // G B G B G // R G R G R // G B G B G // R G R G R // G B G B G acpi4(bayerA, &A_RED, &A_GREEN, &A_BLUE); } out_r[out_pos] = A_RED ; out_g[out_pos] = A_GREEN ; out_b[out_pos] = A_BLUE ; } } } //------------------------------------ // ベイヤパターンの33位置のrgbの画素値を算出する処理 // G11 R12 G13 R14 G15 // B21 G22 B23 G24 B25 // G31 R32 G33 R34 G35 // B41 G42 B43 G44 B45 // G51 R52 G53 R54 G55 static void acpi1(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r32 = *(bayer - 1); unsigned char const r34 = *(bayer + 1); unsigned char const g13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const g22 = *(bayer - BUF_WIDTH - 1); unsigned char const g24 = *(bayer - BUF_WIDTH + 1); unsigned char const g33 = *bayer; unsigned char const g35 = *(bayer - BUF_WIDTH + 2); unsigned char const b23 = *(bayer - BUF_WIDTH); unsigned char const b43 = *(bayer + BUF_WIDTH); //追加で必要な数値を算出 unsigned char const g23 = ((g13 + g22 + g24 + g33)/4); unsigned char const g32 = ((g13 + g22 + g24 + g33)/4); unsigned char const g34 = ((g13 + g22 + g24 + g33)/4); unsigned char const g43 = ((g13 + g22 + g24 + g33)/4); // 処理対象画素(5×5画素の中央)のRGB値を算出 *r = (r32 + r34)/2 + (-g23 + 2 * g33 - g43)/4; *g = g33; *b = (b23 + b43)/2 + (-g32 + 2 * g33 - g34)/4; //------------------------------------ // ベイヤパターンの33位置のrgbの画素値を算出する処理 // B11 G12 B13 G14 B15 // G21 R22 G23 R24 G25 // B31 G32 B33 G34 B35 // G41 R42 G43 R44 G45 // B51 G52 B53 G54 B55 static void acpi2(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r22 = *(bayer - BUF_WIDTH - 1); unsigned char const r24 = *(bayer - BUF_WIDTH + 1) unsigned char const r42 = *(bayer + BUF_WIDTH - 1); unsigned char const r44 = *(bayer + BUF_WIDTH + 1); unsigned char const g23 = *(bayer - BUF_WIDTH); unsigned char const g25 = *(bayer - BUF_WIDTH + 2); unsigned char const g32 = *(bayer - 1); unsigned char const g34 = *(bayer + 1); unsigned char const g41 = *(bayer + BUF_WIDTH - 2); unsigned char const g43 = *(bayer + BUF_WIDTH); unsigned char const g45 = *(bayer + BUF_WIDTH + 2) unsigned char const b13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const b31 = *(bayer + BUF_WIDTH - 2); unsigned char const b33 = *bayer; unsigned char const b35 = *(bayer - BUF_WIDTH + 2); unsigned char const b53 = *(bayer - 2 * BUF_WIDTH ); // cとdの値を算出 unsigned int const c = ((-g24 + 2 * g33 - g42) + (r24 - r42)); unsigned int const d = ((-g22 + 2 * g33 - g44) + (r22 - r44)); // cとdの絶対値を算出 c = abs(c); d = abs(d); // 処理対象画素(5×5画素の中央)のRGB値を算出 if (c < d) { *r = ((r24 + r42))/2 + ((-g24 + 2 * g33 - g42))/4; } else if (c > d) { *r = ((r22 + r44))/2 + ((-g22 + 2 * g33 - g44))/4; } else (c = d) { *r = ((r24 + r42 + r22 + r44)/4) + ((-g22 - g24 + 4 * g33 - g42 - g44)/8); } // eとfの値を算出 unsigned int const e = ((-b13 + 2 * b33 - b53) + (g23 - g43)); unsigned int const f = ((-b31 + 2 * b33 - b35) + (g32 - g34)); // eとfの絶対値を算出 e = abs(e); f = abs(f); if (e < f) { *g = ((g23 + g43))/2 + ((-r13 + 2 * r33 - r53))/4; } else if (e > f) { *g = ((g32 + g34))/2 + ((-r31 + 2 * r33 - r35))/4; } else (e = f) { *g = ((g23 + g43 + g32 + g34)/4) + ((-r13 - r31 + 4 * r33 - r35 - r53)/8); } *b = B33 } //------------------------------------ // ベイヤパターンの33位置のrgbの画素値を算出する処理 // R11 G12 R13 G14 R15 // G21 B22 G23 B24 G25 // R31 G32 R33 G34 R35 // G41 B42 G43 B44 G45 // R51 G52 R53 G54 R55 static void acpi3(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r13 = *(bayer - 2 * BUF_WIDTH ); unsigned char const r31 = *(bayer + BUF_WIDTH - 2); unsigned char const r33 = *bayer; unsigned char const r35 = *(bayer - BUF_WIDTH + 2); unsigned char const r53 = *(bayer - 2 * BUF_WIDTH ); unsigned char const g23 = *(bayer - BUF_WIDTH); unsigned char const g32 = *(bayer - 1); unsigned char const g34 = *(bayer + 1); unsigned char const g43 = *(bayer + BUF_WIDTH); unsigned char const b22 = *(bayer - BUF_WIDTH - 1); unsigned char const b24 = *(bayer - BUF_WIDTH + 1) unsigned char const b42 = *(bayer + BUF_WIDTH - 1); unsigned char const b44 = *(bayer + BUF_WIDTH + 1); // 処理対象画素(5×5画素の中央)のRGB値を算出 // hとiの値を算出 unsigned int const h = ((-r13 + 2 * r33 - r53) + (g23 - g43)); unsigned int const i = ((-r31 + 2 * r33 - r35) + (g32 - g34)); // hとiの絶対値を算出 h = abs(h); i = abs(i); if (h < i) { *g = ((g23 + g43))/2 + ((-r13 + 2 * r33 - r53))/4; } else if (h > i) { *g = ((g32 + g34))/2 + ((-r31 + 2 * r33 - r35))/4; } else (h = i) { *g = ((g23 + g43 + g32 + g34)/4) + ((-r13 - r31 + 4 * r33 - r35 - r53)/8); } // jとkの値を算出 unsigned int const j = ((-g24 + 2 * g33 - g42) + (b24 - b42)); unsigned int const k = ((-g22 + 2 * g33 - g44) + (b22 - b44)); // jとkの絶対値を算出 j = abs(j); k = abs(k); if (j < k) { *b = ((b24 + b42))/2 + ((-g24 + 2 * g33 - g42))/4; } else if (j > k) { *b = ((b22 + b44))/2 + ((-g22 + 2 * g33 - g44))/4; } else (j = k) { *b = ((b24 + b42 + b22 + b44)/4) + ((-g22 - g24 + 4 * g33 - g42 - g44)/8); } *r = r33 } //------------------------------------ // ベイヤパターンの22位置のrgbの画素値を算出する処理 // G11 B12 G13 B14 G15 // R21 G22 R23 G24 R25 // G31 B32 G33 B34 G35 // R41 G42 R43 G44 R45 // G51 B52 G53 B54 G55 static void acpi4(unsigned char const* const bayer, unsigned int* const r, unsigned int* const g, unsigned int* const b) { // 周囲5×5の画素値を代入する unsigned char const r23 = *(bayer - BUF_WIDTH); unsigned char const r43 = *(bayer + BUF_WIDTH); unsigned char const g22 = *(bayer - BUF_WIDTH - 1); unsigned char const g24 = *(bayer - BUF_WIDTH + 1) unsigned char const g31 = *(bayer + BUF_WIDTH - 2); unsigned char const g33 = *bayer; unsigned char const g35 = *(bayer - BUF_WIDTH + 2); unsigned char const g42 = *(bayer + BUF_WIDTH - 1); unsigned char const g44 = *(bayer + BUF_WIDTH + 1); unsigned char const b32 = *(bayer - 1); unsigned char const b34 = *(bayer + 1); //追加で必要な数値を算出 unsigned char const g23 = (g22 + g24); unsigned char const g32 = (g31 + g33); unsigned char const g34 = (g33 + g35); unsigned char const g43 = (g42 + g44); // 処理対象画素(5×5画素の中央)のRGB値を算出 // rの値を算出 *r = (r23 + r43)/2 + (-g23 + 2 * g33 - g43)/4; // gの値を算出 *g = g33; // bの値を算出 *b = (b32 + b34)/2 + (-g32 + 2 * g33 - g34)/4; } }

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

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

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

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

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

thkana

2021/07/26 21:52

> さらっとソースを見て、適当に目に付いた間違い エラーがあることがわかっているのなら、エラーメッセージに挙げられた場所から見始めます。 自分の手元にあるものを質問に載せればいいだけなのにエラーメッセージを示さないということは、「コンパイラに頼らずにエラーを見つけてみろ」という回答者に対する挑戦状かなにかのつもりですか?
y_waiwai

2021/07/26 22:03

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
gentaro

2021/07/26 23:49

そのエラーを解決するのも課題のうちでしょ。 宿題代行サイトでも無料家庭教師サイトでもないんだから、自分で何とかできないなら先生に質問するべき内容。
int32_t

2021/07/27 00:06

27個のエラーすべてを正確に質問文に追記してください。 別の質問にも同じようなコメントをしましたが、そちらは削除申請中だそうで。質問文は編集できるので、質問文に不備があったら新たに質問を作らずに、編集して改善してください。
snowman_F

2021/07/27 06:02 編集

今後はそのようにします。
guest

回答4

0

さらっとソースを見て、適当に(再び)

ソースコードの数箇所にありましたが、**else (j = k)**のような箇所がおかしいです。
elseは中身書いちゃダメな構文なので、下記のような書き方に変えて下さい。

if(...){ } else if(...) { } else { }

投稿2021/07/27 01:58

stdio

総合スコア3307

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

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

snowman_F

2021/07/27 05:59

エラー数減りました。ありがとうございます!
guest

0

さらっとソースを見て、適当に

{} の対応がおかしいんじゃーの?

(指定されている通りに,てきとーに述べた)

投稿2021/07/27 01:22

fana

総合スコア11708

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

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

guest

0

ベストアンサー

エラーの発生個所を局所化したら良いと思います。

現在のソースは一旦コピーしておいて、関数単位でコメントアウト、または削除してコンパイルしてみます。例えば関数acpi1をコメントアウトし、呼び元もコメントアウトしてコンパイルし、エラー内容が消えれば原因は該当の関数に有る、エラーが変わらなければ他の箇所に原因が有ると分かります。
思い切って半分ぐらい削除してみるのも効率的かも知れません。

C言語のソースはちょっとした入力ミスで構文が崩れてしまい、エラーが大量発生してしまうことが有ります(一か所のミスでもです)。モジュール分けして、ファイルあたりの行数を少なくすることでエラーを見つけ易くすることもできます。

ご参考までに。

投稿2021/07/27 00:18

BlueMoon

総合スコア1339

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

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

snowman_F

2021/07/27 06:01 編集

ご回答ありがとうございます! 今後はそのようにやってみます。
guest

0

エラー数0になりました。皆様ご意見ありがとうございました。

投稿2021/07/27 05:59

編集2021/07/27 06:02
snowman_F

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問