teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/03/22 00:48

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -7,4 +7,52 @@
7
7
  - 行の先頭の次から行の最後までループ
8
8
  - 最後の状態と現在の値が同じなら、++カウンタ
9
9
  そうでないなら、カウンタ=1
10
- - カウンタの値に応じた処理
10
+ - カウンタの値に応じた処理
11
+
12
+ ---
13
+ 【追記】
14
+ ソースを書ける方なら分かってくれるかなと思って手抜きしました。
15
+ 下記イメージです。(コンパイルしてませんのでエラーがでたら悪しからず。)
16
+ 列数が0の時は異常動作します。現在は列数=行数=line_maxですが、もし列数と行数を異なるパラメータにする時はパラメータ・チェックが必要です。
17
+
18
+ ```C++
19
+ #define WHITE_MODULE (0x00) // この値を変える事で分かりやすくなるなら変更してもOK
20
+ #define BLACK_MODULE (0xFF) // この値を変える事で分かりやすくなるなら変更してもOK
21
+ typedef unsigned char BYTE;
22
+ int ErrPointLine(BYTE *pQRdata, int version)
23
+ {
24
+ int Eret=0; /* エラーポイント */
25
+ // int line_max = _qr_code_info[version].side_module_num;
26
+ int line_max = 40; // 暫定で 40 固定
27
+
28
+ // 列
29
+ for( int h=0 ; h < line_max ; h++ ){
30
+ int counter= 1;
31
+ const BYTE *pHead = pQRdata + (line_max * h);
32
+ BYTE last = *pHead;
33
+ for(int n=1 ; n < line_max ; n++ ){
34
+ BYTE LineCol = *(pHead + n);
35
+
36
+ if(LineCol == last ){
37
+ counter++;
38
+ }
39
+ else {
40
+ last=LineCol;
41
+ counter=1;
42
+ }
43
+
44
+ // 同色が5つ続くなら+3の失点
45
+ if(counter == 5){
46
+ Eret += 3;
47
+ }
48
+ else if(counter> 5){
49
+ // 以後続くたびに+1の失点
50
+ Eret++;
51
+ }
52
+ }
53
+ }
54
+ printf("Total Error Point = %d\n", Eret);
55
+
56
+ return Eret;
57
+ }
58
+ ```