2012-08-03 255 views
0

我正在處理一個處理外部硬件通信的應用程序,並且遇到了獲取程序包校驗和的問題。 (我還在學習Objective C的同時使這個程序,所以我在這個仍然相當新) 在C語言編寫的另一個代碼,校驗和計算如下:如何計算目標中的CheckSum 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); 

} 

無警告或錯誤,但它說鐺:錯誤:連接命令,退出代碼失敗1 有誰知道這是爲什麼?我該如何解決它?

+0

你在紙上試過了嗎? – 2012-08-03 20:45:22

+0

它編譯和執行對我來說很好,所以鏈接器的確切錯誤信息是什麼?聽起來你可能只需要做一個乾淨的構建。 – Brian 2012-08-03 20:46:49

回答

1

它有效的所有有效C代碼目標C代碼。不要嘗試將其重寫爲Objective C方法 - 對此沒有價值。

修改原始函數的竅門是它依賴於幾件事情:byte是typedeffed,以及一個名爲x_ptr的全局/靜態變量。

關於x_ptr,它來自哪裏以及它如何在原始文件中初始化,我們從粘貼的片段中什麼也不知道。所以假設字節數組synByteSOH是數據塊,你需要的校驗,只是介紹byte*類型的文件中的靜態變量x_ptr並將其初始化到數據塊:

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函數完全可以。從來沒有人說每一段代碼都應該在類方法中。