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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

1039閲覧

DataMatrixを作るためにECC200のエラーコード作成方法についてC->java

HogHog

総合スコア1

C

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2021/05/18 04:02

編集2021/05/21 06:42

JISX0512を参考にエラーコードの作成を使用としています。
C言語での作成方法は乗っていたのですが(後述)現在使用できるエディタがProcessingなのでそれで使えるように書き換えようとしています。

しかし、想定していた挙動がなされないため質問させていただきました。

JISX0512
https://www.kikakurui.com/x0/X0512-2015-01.html
(別紙Eに載っているコード。これをProcessingで再現したい)

C

1/* "prod(x, y, log, alog, gf)" returns the product "x" times "y" */ 2int prod(int x, int y, int *log, int *alog, int gf) { 3 if (!x || !y) return 0; 4 else return alog[(log[x] + log[y]) % (gf-1)]; 5} 6/* "ReedSolomon(wd, nd, nc, gf.pp)" takes "nd" data codeword values in wd[] */ 7/* and adds on "nc" check codewords, all within GF(gf) where "gf" is a */ 8/* power of 2 and "pp" is the value of its prime modulus polynomial */ 9void ReedSolomon(int *wd, int nd, int nc, int gf, int pp) { 10 int i, j, k, *log,*alog,*c; 11/* allocate, then generate the log & antilog arrays: */ 12 log = malloc(sizeof(int) * gf); 13 alog = malloc(sizeof(int) * gf); 14 15 log[0] = 1-gf; alog[0] = 1; 16 for (i = 1; i < gf; i++) { 17  alog[i] = alog[i-1] * 2; 18  if (alog[i] >= gf) alog[i] ^= pp; 19  log[alog[i]] = i; 20 } 21/* allocate, then generate the generator polynomial coefficients: */ 22 c = malloc(sizeof(int) * (nc+1)); 23 for (i=1; i<=nc; i++) c[i] = 0; c[0] = 1; 24  for (i=1; i<=nc; i++) { 25   c[i] = c[i-1]; 26   for (j=i-1; j>=1; j--) { 27    c[j] = c[j-1] ^ prod(c[j],alog[i],log,alog,gf); 28   } 29   c[0] = prod(c[0],alog[i],log,alog,gf); 30  } 31 /* clear, then generate "nc" checkwords in the array wd[] : */ 32 for (i=nd; i<=(nd+nc); i++) wd[i] = 0; 33 for (i=0; i<nd; i++) { 34  k = wd[nd] ^ wd[i] ; 35  for (j=0; j<nc; j++) { 36   wd[nd+j] = wd[nd+j+l] ^ prod(k,c[nc-j-1],log, alog,gf); 37  } 38 } 39 free(c); 40 free(alog); 41 free(log); 42} 43

webでRuntimeErrorが出たもの
ideoneというサイトで回しました

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int prod(int x,int y,int *log,int *alog,int gf){ 5 if(!x || !y) 6 return 0; 7 else 8 return alog[(log[x] + log[y]) %(gf-1)]; 9} 10 11void ReedSolomon(int *wd, int nd, int nc, int gf, int pp) { 12 int i,j,k,*log,*alog,*c; 13 log = malloc(sizeof(int) * gf); 14 alog = malloc(sizeof(int) * gf); 15 log[0] = 1-gf; alog[0] = 1; 16 for (i = 1; i < gf; i++) { 17 alog[i] = alog[i-1] * 2; 18 if (alog[i] >= gf) alog[i] ^= pp; 19 log[alog[i]] = i; 20 } 21 c = malloc(sizeof(int) * (nc+1)); 22 23 for (i=1; i<=nc; i++) c[i] = 0; 24 c[0] = 1; 25 for (i=1; i<=nc; i++) { 26 c[i] = c[i-1]; 27 for (j=i-1; j>=1; j--) { 28 c[j] = c[j-1] ^ prod(c[j],alog[i],log,alog,gf); 29 } 30 c[0] = prod(c[0],alog[i],log,alog,gf); 31 } 32 for (i=nd; i<=(nd+nc); i++) { 33 wd[i] = 0; 34 } 35 for (i=0; i<nd; i++) { 36 k = wd[nd] ^ wd[i]; 37 for (j=0; j<nc; j++) { 38 wd[nd+j] = wd[nd+j+1] ^ prod(k,c[nc-j-1],log, alog,gf); 39 } 40 } 41 free(c); 42 free(alog); 43 free(log); 44} 45int main() 46{ 47 printf("Hello, World!\n"); 48 int wd[3] = {142,164,186}; 49 ReedSolomon(wd,3,5,28,301); 50 return 0; 51}

//追記
gfを28としていますが調べてみたところガロア体なのでGF(2^8=256)ではないかと考えています。

processing用に書き換えたもの

processing

1void draw(){ 2 int[] inst = {142,164,186}; 3 ReedSolomon(inst,3,5,28,301); 4} 5 6IntDict logDic = new IntDict(); 7IntDict alogDic = new IntDict(); 8 9int prod(int x, int y, IntDict log, IntDict alog, int gf) { 10 if (x == 0 || y == 0) { 11 return 0; 12 } else { 13 return alogDic.get( str( ( logDic.get(str(x)) + logDic.get(str(y)) )%(gf-1))); 14 } 15} 16 17void ReedSolomon(int[] wd, int nd, int nc, int gf, int pp) { 18 int k; 19 logDic.set(str(0), 1-gf); 20 alogDic.set(str(0), 1); 21 22 for (int i = 1; i < gf; i++) { 23 alogDic.set(str(i), alogDic.get(str(i-1))*2); 24 if (alogDic.get(str(i)) >=gf) 25 alogDic.set(str(i), alogDic.get(str(i))^pp); 26 //logDic.set( str(i), ( alogDic.get( str(i) ) ) ); 27   logDic.set( str ( alogDic.get( str(i) )) ,(i) ); 28 } 29 30 int[] c = new int[nc + 1]; 31 for (int i = 1; i <= nc; i++) { 32 c[i] = 0; 33 } 34 c[0] = 1; 35 println("c"); 36 for (int i = 1; i <= nc; i++) { 37 c[i]=c[i-1]; 38 for (int j = i-1; j >= 1; j--) { 39 c[j] = c[j-1]^prod(c[j], alogDic.get(str(i)), logDic, alogDic, gf); 40   //このprod()で該当するx,yが存在しないとエラーが出る 41 } 42 c[0] = prod(c[0], alogDic.get(str(i)), logDic, alogDic, gf); 43 } 44 45 int[] wd2 = new int[nd + nc+1]; 46 for (int i = 0; i < nd; i++) { 47 wd2[i] = wd[i]; 48 } 49 for (int i=nd; i <= (nd+nc); i++) { 50 wd2[i] = 0; 51 } 52 for (int i=0; i < nd; i++) { 53 k = wd2[nd] ^ wd2[i] ; 54 for (int j=0; j < nc; j++) { 55 wd2[nd+j] = wd2[nd+j+1] ^ prod(k, c[nc-j-1], logDic, alogDic, gf); 56 } 57 } 58} 59//wd2の中に142,164,186,114,25,5,88,102が入ってほしい

ーーー
現在起こっていること
Processingでは配列の動的確保の方法が異なるためDictionaryを利用。
配列の追加についても別の配列を新しく作成して代用
書き換えはおそらくできたが情報が足りないということでエラーが発生する。
No key named '823'
変数logに該当する値がないとのこと。

ちなみにそもそもCのほうがあっているかどうか試してみようと思いWebのほうではありますが試したところRuntimeErrorというのが出て検証できませんでした。

足りない情報等あれば指摘していただけると助かります。

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

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

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

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

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

dodox86

2021/05/18 05:12

> ちなみにそもそもCのほうがあっているかどうか試してみよう もともとのサンプルのC言語のソースファイルですが、間違っている(コンパイルエラー)ようです。下の方の以下のコード部分、 > for (j=0; j<nc; j++) { >    wd[nd+j] = wd[nd+j+l] ^ prod(k,c[nc-j-1],log, alog,gf); > } wd[nd + j + l] とありますが、l(小文字のL)は未定義の変数で、コンパイルエラーになります。数字の1(いち)の間違いなのか、それとも本当に未定義(それにしては他の部分で適切そうな値をセットしている部分が無い)なのか。この部分を直してみないとC言語のコードの実行結果と比べることはできなさそうです。
HogHog

2021/05/18 05:28

こちら1でした。 Webに書くとき私もエラーになりまして1に修正したのですが元のコードを載せるため参考ページより取り込みました。 今一度webで回せる状態のコードを書いていますが少々エラーが出ているのでお待ちください
HogHog

2021/05/18 05:57

コードの方追記いたしました
guest

回答2

0

直接の回答ではないです(算数どまりなので中身はさっぱりわかりません^^;

ProcessingはJavaコードも動きます(Java5相当)ので、Javaで調べたほうがいいと思います。

現在リードソロモン符号をjavaで書こうとしています。 - や... - Yahoo!知恵袋

こちらの回答のようにZXingから関連コードを拝借してテストしてみました。
5つのファイルを追加時に、.javaと拡張子を付けるのを忘れないようにしてください。

テストコードだけ質問に合わせました。

Processing

1import java.util.Arrays; 2 3final int ECC_COUNT = 5; 4final int[] MESSAGE = { 142, 164, 186 }; 5 6int[] data = new int[MESSAGE.length + ECC_COUNT]; 7System.arraycopy(MESSAGE, 0, data, 0, MESSAGE.length); 8ReedSolomonEncoder encoder = new ReedSolomonEncoder(GenericGF.DATA_MATRIX_FIELD_256); 9encoder.encode(data, ECC_COUNT); 10println("encoded:\n" + Arrays.toString(data)); 11 12data[0] = 0; 13data[1] = 0; 14//data[5] = 0; 15println("changed:\n" + Arrays.toString(data)); 16 17ReedSolomonDecoder decoder = new ReedSolomonDecoder(GenericGF.DATA_MATRIX_FIELD_256); 18try { 19 decoder.decode(data, ECC_COUNT); 20 println("decoded:\n" + Arrays.toString(data)); 21} 22catch (ReedSolomonException e) { 23 println("デコードに失敗しました"); 24}
encoded: [142, 164, 186, 114, 25, 5, 88, 102] changed: [0, 0, 186, 114, 25, 5, 88, 102] decoded: [142, 164, 186, 114, 25, 5, 88, 102]

投稿2021/05/21 08:49

TN8001

総合スコア9363

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

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

0

自己解決

できなかった原因はガロア値を28にしていたことによるものでした。
下に修正済みコードを入れます。

processing

1void setup(){ 2 int[] instaa = {142, 164, 186}; 3 ReedSolomon(instaa,3,5,256,301); 4} 5void ReedSolomon(int[] wd, int nd, int nc, int gf, int pp) { 6 int k; 7 IntDict logDic = new IntDict(); 8 IntDict alogDic = new IntDict(); 9 logDic.set(str(0), 1-gf); 10 alogDic.set(str(0), 1); 11 for (int i = 1; i < gf; i++) { 12 alogDic.set(str(i), alogDic.get(str(i-1)) * 2); 13 if (alogDic.get(str(i)) >= gf) { 14 alogDic.set(str(i), alogDic.get(str(i)) ^ pp); 15 } 16 logDic.set( str ( alogDic.get( str(i) )), (i)); 17 } 18 19 int[] c = new int[nc + 1]; 20 for (int i = 1; i <= nc; i++) { 21 c[i] = 0; 22 } 23 c[0] = 1; 24 25 for (int i = 1; i <= nc; i++) { 26 c[i]=c[i-1]; 27 for (int j = i-1; j >= 1; j--) { 28 c[j] = c[j-1]^prod(c[j], alogDic.get(str(i)), logDic, alogDic, gf); 29 } 30 c[0] = prod(c[0], alogDic.get(str(i)), logDic, alogDic, gf); 31 } 32 33 int[] wd2 = new int[nd + nc + 1]; 34 for (int i = 0; i < nd; i++) { 35 wd2[i] = wd[i]; 36 } 37 for (int i=nd; i <= (nd + nc); i++) { 38 wd2[i] = 0; 39 } 40 for (int i=0; i < nd; i++) { 41 k = wd2[nd] ^ wd2[i]; 42 for (int j=0; j < nc; j++) { 43 wd2[nd+j] = wd2[nd+j+1] ^ prod(k, c[nc-j-1], logDic, alogDic, gf); 44 } 45 } 46 println(wd2); 47}

wd2の配列が一つ多くなっているのは減らすと一番下のforで突っかかってしまうためです。
まだ改善すべき点はありますが一応解決したので終わりとさせていただきます。
ありがとうございます。

投稿2021/05/21 07:51

HogHog

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問