Массив для указателя на функцию в C. Как выбрать, какой элемент я хочу из массива, используя перечисления? - PullRequest
0 голосов
/ 07 января 2020

Я хочу, чтобы пользователь ввел значение, подобное ADD или SUB, чтобы выполнить желаемую операцию, но я получаю "индекс массива вместо целого числа". Я знаю, что вместо этого я могу вводить цифры, например, 0, 1, 2 и т. Д. c. из-за того, как работают перечисления, но я хочу сделать его более удобным для пользователя. Я также не могу найти в Интернете никакой информации об этом, и мои книги не помогают. Помогите пожалуйста!

#include<stdio.h>
#include<stdlib.h>

int multiply(int , int);
int sum(int, int);
int divide(int, int);
int sub(int, int);

int(*calc[])(type) = {sum, sub, multiply, divide};
enum response{ADD, SUB, MULT, DIV};
enum response type;

int main()
{
    int a, b;
    char s[4];
    printf("Enter two numbers and the operation. Operations: ADD, SUB, MULT, DIV");
    scanf("%d %d %s", &a, &b, &s);
    printf("The result = %d",(calc[s])(a, b));
    return 0;
}
int multiply(int a, int b)
{
    return a*b;
}

int sub(int a, int b)
{
    return a-b;
}
int sum(int a, int b)
{
    return a+b;
}
int divide(int a, int b)
{
    return a/b;
}



1 Ответ

0 голосов
/ 07 января 2020

Enum-константы по сути являются символическими c именами для целочисленных констант. Они не совпадают со строками, поэтому они не могут напрямую использовать последние в качестве замены первых.

Вам необходимо проверить значение данной строки и выбрать соответствующее перечисление на основе этого.

enum response getResponse(const char *str)
{
    if (!strcmp(str, "ADD")) {
         return ADD;
    } else if (!strcmp(str, "SUB")) {
         return SUB;
    } else if (!strcmp(str, "MULT")) {
         return MULT;
    } else if (!strcmp(str, "DIV")) {
         return DIV;
    } else {
         return (enum response)-1;
    }
}

int main()
{
    int a, b;
    char s[4];
    scanf("%d %d %4s", &a, &b, s);
    enum response resp = getResponse(s);
    if (resp == (enum response)-1) {
        printf("invalid operation\n");
    } else {
        printf("The result = %d",(calc[resp])(a, b));
    }
    return 0;
}

Кроме того, тип calc является неправильным. Следует указать типы каждого аргумента членов массива:

int(*calc[])(int, int) = {sum, sub, multiply, divide};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...