Могу ли я написать функцию, которая может возвращать один тип данных или другой в C? - PullRequest
0 голосов
/ 23 декабря 2018

Как мне сделать функцию, которая либо возвращает ноль, либо массив чисел.Моя функция должна проверить, является ли входная строка со строкой двух шестнадцатеричных чисел, разделенных пробелом, такой как эта строка: "a48 2b4".Если это действительно так, верните массив int из двух чисел, если нет, например, если он содержит не шестнадцатеричные символы или слишком много пробелов, верните 0. Как я могу сделать это в c?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я также мог бы использовать Союз .Объединение может хранить два или более типов значений.

union OptionalInt {
    int Value;
    bool IsNull;
};

union OptionalInt ParseHex(char *Str) {
    //...
    if(/*Success*/) {
        return (union OptionalInt){/*Value*/, 0};
    }else{
        return (union OptionalInt){0, 1};
    }
}
0 голосов
/ 23 декабря 2018

Поскольку вы не можете напрямую вернуть массив в любом случае, вам нужно будет изменить свой план.Во-первых, обратите внимание, что два альтернативных возврата, которые вы описываете, в основном не связаны между собой: один - данные, другой - код состояния.Они не подходят как альтернативы, и это одна из причин, по которой вы боретесь.

Хороший, чистый дизайн будет следовать из предложенной в комментариях альтернативы @ try-catch-finally: позвольте вызывающему пройти (aуказатель на) массив функции в качестве аргумента.В случае успеха функция заполняет первые два элемента (полагаясь на то, что вызывающая сторона предоставила подходящий для этого указатель).Фактическое возвращаемое значение функции может быть кодом состояния.Я думаю, как вы думаете об этом, это будет 0 в случае неудачи и что-то еще (1?) В случае успеха, хотя это и не так, как в большинстве стандартных библиотечных функций.

Пример:

int parseHex(const char *str, int *parsed_result) {
    // ...
    if (success) {
        parsed_result[0] = hex0;
        parsed_result[1] = hex1;
        return 1;
    } else {
        return 0;
    }
}

Существует как минимум два других способа решения проблемы, но этот способ является чистым и последовательным, и на него не ложится ответственность за освобождение динамически выделяемой памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...