0

外部ハードウェア通信を扱うアプリに取り組んでいますが、パッケージのチェックサムの取得に問題があります。(このアプリを作成している間、私はまだオブジェクティブ C を学んでいるので、これについてはまだかなり新しいです。) C で書かれた別のコードでは、チェックサムは次のように計算されました。

byte CalculateCheckSum (byte txcount){
    byte local_cs=0;
    while(txcount>0){
        local_cs+=*x_ptr;
        x_ptr += 1;
        txcount--;
    };
    return (~local_cs+1);
}

Objective Cのコードをいくつか使用しようとしました:

u_int8_t synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};
- (Byte)CalcCheckSum:(Byte)i
{   u_int8_t synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};
    Byte local_cs = 0;
    int j = 0;
    while (i>0) {
        local_cs += synByteSOH[j];
        i--;
        j++;
    };
    return (~local_cs+1);

}

警告やエラーはありませんが、clang: error: linker command failed with exit code 1 と言われています。そして、どうすれば修正できますか?

4

1 に答える 1

1

すべての有効な C コードは有効な Objective C コードです。それを Objective C のメソッドに書き直そうとしないでください。それには価値がありません。

元の関数を適応させる秘訣は、それがいくつかのことに依存していることです:byte型定義されていること、およびx_ptr.

x_ptr については、それがどこから来て、オリジナルでどのように初期化されているかについて、貼り付けられたスニペットからは何もわかりません。したがって、バイト配列 synByteSOH がチェックサムが必要なデータ ブロックであると仮定すると、タイプのファイル静的変数 x_ptr を導入し、byte*それをデータ ブロックに初期化します。

typedef unsigned char byte;
static byte *x_ptr;

byte CalculateCheckSum (byte txcount)
//...Follows as pasted

//...

//And now we call it elsewhere:
byte synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};         
x_ptr = synByteSOH
byte Checksum = CalculateCheckSum(4); //4 is the data block size

一般に、ObjC プロジェクトであっても、C 関数を使用してもまったく問題ありません。コードのすべての部分がクラスメソッドにあるべきだと言った人は誰もいません。

于 2012-08-03T20:49:07.887 に答える