# 176-D выражение не имеет эффекта "предупреждение, когда я создал массив указателей на функции. Что здесь происходит? - PullRequest
0 голосов
/ 27 сентября 2019

У меня проблемы с пониманием того, что происходит.Я работаю над интерфейсом командной строки для маленького робота, использующего микроконтроллер Texas Instruments, и один из моих профессоров порекомендовал множество указателей на функции, поэтому я так и сделал.Мой код компилируется, но я получаю предупреждение:

#176-D expression has no effect uartconsole.c

Вот моя функция, моя функция:

void startConsole(void)
{

    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

    Configure_UART1();

        // Enables port, sets pins 1-3 (RGB) pins for output
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

    unsigned char *input;

    void (*p[4])(unsigned char);


    p[0] = forward;
    p[1] = reverse;
    p[2] = left;
    p[3] = right;



    /* printf goes to the UART com port */
    printf("\f======== Welcome to the Console ========\n");
    printf("Enter a command followed by return.\n"
           "Type help for a list of commands.\n\n");



    /* Loop forever receiving commands */
    while(true) {
        /* Get the user's input */
        if(UARTCharsAvail(UART_BASE)) {
            input = UARTCharGet(UART_BASE);



            switch(*input) {
                case 'fo':
                    (*p[0]);
                case 're':
                    (*p[1]);
                case 'le':
                    (*p[2]);
                case 'ri':
                    (*p[3]);
                default:
                    UARTPutString(UART_BASE, "\nCommand Unknown\n\r");
            }
        }

Как я могу исправить это предупреждение?Я просмотрел предыдущие сообщения Stackoverflow, касающиеся указателей на функции, но я не понимаю, почему это все еще приводит к моей ошибке.

1 Ответ

2 голосов
/ 27 сентября 2019

(*p[0]) обозначает функцию, на которую указывает p[0].Это не вызывает функцию.Чтобы вызвать функцию, вы должны применить круглые скобки и аргумент, как с (*p[0])(*input).В отсутствие вызова функции оператор (*p[0]); является просто указателем функции, который отбрасывается без выполнения каких-либо действий, поэтому компилятор предупреждает вас, что это не то, что вы хотели сделать.

...