c函数返回数组并将数组与另一个进行比较

时间:2016-02-19 11:07:28

标签: c arrays function

下面的函数从UART读取字符并将它们放在一个数组中。它包含来自硬件设备的repsonse。

在main中我想检查数组是否包含正确的响应。

如何让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();  
}
}

4 个答案:

答案 0 :(得分: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;

注意:我将correctResponse扩展为6个字节,以便进行比较。

答案 1 :(得分:0)

嗯,首先,你永远不能返回数组。你有两个选择,更常用的选项是在main中创建数组,并将指针传递给它作为你的一个参数(通常“输出”参数是最后一个,但这显然无关紧要),或者你的另一个选择是在你的函数中创建数组(它必须是static否则它会在函数返回后超出范围),并返回一个指向数组的指针。考虑到不建议使用这种“静态”方法,您的第二个选项可能是malloc()函数中数组的空间,并将指针返回给它(不要忘记free() in主!)。

@OleksandrKravchuk链接到的视频返回一个指向局部变量的指针,这是一个坏主意(你可以使用static技巧,但这也不是一个完美的解决方案.99%的时间拥有它作为一个参数是这样做的方式)。要清楚,有 NO WAY 返回数组(无论如何都是按值)。不要让他的回答让你感到困惑。

答案 2 :(得分:0)

有多种方法可以返回数组。我强烈建议你调查所有这些以便于理解。

How to Return an Array from a Function in C

关于比较数组,这个基本问题已被问过一百万次了。

C array comparison

答案 3 :(得分:0)

  

如何让getData()返回一个数组

实际上不需要void getData(int length)返回数组。您只需将数组传递给函数,然后直接修改它即可。

因此,您可以将原型编写为:

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

如何将此数组与correctResponse数组进行比较?

鉴于同一类型response的两个数组unsigned charmemcmp且大小相同,您可以使用reponse进行比较并查看是否correctResponse匹配int ret_val = memcmp( correctResponse, response, sizeof(correctResponse) ); if( ret_val == 0 ) printf( "Response match.\n" ); 。例如,

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height + 50 , 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}