2016-02-19 112 views
1

下面的函數從UART讀取字符並將它們放入數組中。它包含來自硬件設備的repsonse。c函數返回數組並將其與另一個數組進行比較

主要我想檢查數組是否包含正確的響應。

我怎樣才能得到getData()返回一個數組,我該如何比較這個數組與correctResponse數組?

void getData(int length){ 
    int i; 
    int buffresponse[6]; 
    for (i = 0; i < length; i++) 
    { 
     //Perform a single character read from the UART interfac 
     buffresponse[i] = getcharacter(UART_4); 
     } 
     buffresponse[i] = 0; 
} 

int main(void) 
{ 
unsigned char correctResponse[] = { 0x56, 0x00, 0x26, 0x00 }; 
getData(); 
} 
} 

回答

0

那麼,首先,你永遠不能返回一個數組。你有兩個選擇,更常用的選項是在main中創建數組,並將一個指針作爲參數傳遞(通常「輸出」參數是最後一個,但這顯然沒有關係),或者你的另一個選擇是在你的函數中創建數組(它必須是static,否則一旦函數返回它就會超出範圍),並返回一個指向數組的指針。考慮到不建議使用這種「靜態」方法,您的第二個選項可能會改爲函數中數組的空格,並返回指針(不要忘記主文件中的free())。

@OleksandrKravchuk鏈接到的視頻會返回一個指向局部變量的指針,這是一個糟糕的主意(您可以使用static的詭計,但這不是一個完美的解決方案)99%的時間將它作爲爭論是這樣做的方式)。要清楚,有沒有辦法返回一個數組(按值,反正)。不要讓他的回答混淆你。

2

返回實際的陣列的唯一方法是將其包裝在一個struct和由值返回。你可能不想這樣做。典型的解決方案是通過輸出緩衝器,像這樣:

void getData(unsigned char *buf, size_t length) 
{ 
} 

則呼叫者將提供一個緩衝液:

unsigned char response[6]; 
getData(response, sizeof response); 
const char correctResponse[] = "\x56\x00\x26\x00\x00\x00"; 
const bool equal = memcmp(response, correctResponse, sizeof response) == 0; 

注:I擴展correctResponse是用於比較的6個字節有道理。

+0

我正在開發一個單片機,不能使用'memcmp()'還有另外一種方法嗎? – transcend

+0

@transcend,一個比較每個字節的循環? –

0

我怎樣才能獲得的getData()返回一個數組

實際上沒有必要爲getData()返回數組。你可以將數組傳遞給函數,並直接修改它。

void getData(unsigned char response[], int length); // no need local array `buffresponse` 

我怎麼可以比較這個數組的數組correctResponse:

所以不是void getData(int length),你可以寫你的原型?

鑑於兩個數組correctResponse和同類型unsigned char和相同尺寸的response,您可以使用memcmp比較,看看是否匹配reponsecorrectResponse。例如,

int ret_val = memcmp(correctResponse, response, sizeof(correctResponse)); 
if(ret_val == 0) 
    printf("Response match.\n"); 
+0

作爲'getData'的參數傳遞'response'的指針嗎?這是正確的'getResponseCompare(response [],5)'?謝謝 – transcend

+0

沒有必要傳遞數組的指針 - 只需傳遞數組的名稱就足夠了 - 所以'getResponseCompare(response,5);' – artm

相關問題