Поскольку вы не можете напрямую вернуть массив в любом случае, вам нужно будет изменить свой план.Во-первых, обратите внимание, что два альтернативных возврата, которые вы описываете, в основном не связаны между собой: один - данные, другой - код состояния.Они не подходят как альтернативы, и это одна из причин, по которой вы боретесь.
Хороший, чистый дизайн будет следовать из предложенной в комментариях альтернативы @ 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;
}
}
Существует как минимум два других способа решения проблемы, но этот способ является чистым и последовательным, и на него не ложится ответственность за освобождение динамически выделяемой памяти.