下面的函数从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();
}
}
答案 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)
答案 3 :(得分:0)
如何让getData()返回一个数组
实际上不需要void getData(int length)
返回数组。您只需将数组传递给函数,然后直接修改它即可。
因此,您可以将原型编写为:
,而不是void getData( unsigned char response[], int length ); // no need local array `buffresponse`
correctResponse
如何将此数组与correctResponse数组进行比较?
鉴于同一类型response
的两个数组unsigned char
和memcmp
且大小相同,您可以使用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;
}