tag 标签: 变参函数

相关博文
  • 热度 22
    2014-10-16 14:13
    2041 次阅读|
    3 个评论
    串口经常需要接收指定范围的字符。比如程序运行到某处,提供给用户‘A’、‘B’、‘C’、‘D’四个选项,等待用户输入。如果输入是‘A’、‘B’、‘C’、‘D’的其中一个,则跳转;否则继续等待。 这个功能可以使用if判断语句来实现,它的优点是直观简单,缺点是代码有重复。如果程序中有十次这样的等待输入,就得编写十次if判断语句。 所以,这里使用变参函数将这个功能整合成一个模块。 // 定义在变参函数中,需要调用的显示函数,里面放置打印给用户的提示信息等等 // 函数类型需要符合变参函数中的uart_func // USART_TypeDef用来选择串口号 // 第一个struct uartData用来存储串口接收中断的数据和标志位 // 第二个struct uartData是第一个的缓存,避免数据和标志位在处理的时候被串口接收中断更新 int uxah_dis(USART_TypeDef* USARTx, struct uartData *uartxData, struct uartData *uartxMain) {     usart_printf(USARTx, "\r\nplease enter your choice:  ");     return sFALSE; } // uart_func  func是调用的显示函数,便于重复打印提示信息 // char *byte用来存储最终的有效字符 // int num是可用的字符数量,如果变参为‘A’、‘B’、‘C’、‘D,则num=4 int UART_wait_char(USART_TypeDef* USARTx, struct uartData *uartxData,                 struct uartData *uartxMain, uart_func func, char *byte, int num, ...) {     char *p = (char *)num + sizeof(int);        uint32_t i = 0; START:     func(USARTx, uartxData, uartxMain);      for (i = 0; i num; i++) {                          usart_send_byte(USARTx, *((char *)(p + i * sizeof(int))));          if (i != num - 1)              usart_printf(USARTx, "/");     }     usart_printf(USARTx, "  ");     uartxData-recIrq = sFALSE;     while (1) {              if (uartxData-recIrq = sTRUE) {             uartxMain-recTempH = uartxData-recTempH;             uartxData-recIrq = sFALSE;                                                      usart_send_byte(USARTx, uartxMain-recTempH);                    for (i = 0; i num; i++) {                                                               if (uartxMain-recTempH == *((char *)(p + i * sizeof(int)))) {                     *byte = uartxMain-recTempH;                                      return sTRUE;                                                                  }             }             goto START;            }     }     return sFALSE; } 当执行: UART_wait_char(USART1,  uart1Data,  uart1Main,  uxah_dis, temp, 4, 'A', 'B', 'C', 'D'); 时,会打印: please enter your choice:  A/B/C/D  w please enter your choice:  A/B/C/D  q please enter your choice:  A/B/C/D  A 如果接收到'A', 'B', 'C', 'D'其中一个,则继续执行后面的程序,否则重复打印上面的内容。 当执行: UART_wait_char(USART1,  uart1Data,  uart1Main,  uxah_dis, temp, 2, 'Y', 'N'); 时,会打印 please enter your choice:  Y/N  Q please enter your choice:  Y/N  N 如果接收到'Y', 'N'其中一个,则继续执行后面的程序,否则重复打印上面的内容。 变参函数,在形参的数量和内容不确定的情况下,能够简化分支判断语句,使代码干净整洁。  
  • 热度 19
    2014-10-16 13:57
    1256 次阅读|
    0 个评论
    如果使用p指向函数堆栈区,那么整形或者字符型的变参就表示为: *((int *)p) 使用字符串作为变参函数的入口变参时,存储在函数堆栈中的,是字符串的首地址。字符串首地址的变参表示为: (char *)*((int *)p) 字符串包含的字符则依次表示为: ((char *)*((int *)p)) 或者 *((char *)*((int *)p) + 0) ((char *)*((int *)p)) 或者 *((char *)*((int *)p) + 1) ((char *)*((int *)p)) 或者 *((char *)*((int *)p) + 2)