2016-02-19 77 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

相关问题