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);
}

我尝试将一些代码用于目标 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 回答