вычислениям в калькуляторе.
переделал стек под такую структуру
typedef struct stack {
enum type type;
union var value;
struct stack *prev;
} stack;
enum type {
sign = 1,
dig = 0,
};
union var {
int sign;
double digit;
};
грубо говоря один стек где будут хранится знаки(+ - cos asin mod log и тд) в интовом значении
и там же будут храниться числа в даблах
делаю функцию push(int/double value, stack** out)
возможно ли реализовать как то таким образом, чтобы в функцию можно было подать и инт и дабл, и в зависимости от типа данных функция записывала значения в нужный union и выставляла правильный enum?
Ну тут 2 путя, либо _Generic, либо обёртка, принимающая void * и указатель на функцию обработки, но в любом случае придётся написать 2 функции Хотя можно макросом нагенерить их.
Зачем все так усложнять
есть почитать чего на эту тему?
гугл: _Generic си Либо стандарт 11 посмотри
а как можно проще? я пришел к тому что деверсифецирую. сначала перевожу в обратную польскую запись, потом считаю. можно конечно просто выходную строку перед вычислениями делать не списком а массивом чаров, потом еще раз перепарсить и сосчитать. но чото совсем зашкварно будет )
А переводить одну запись в другую не зашкварно? Почему бы сразу тогда в обратной польской записи не писать?
ну человек же обычный записывает запись на подсчет в обычной инфексной записи ) когда пользуется кулькулятором
Какой человек? Емаксеров вполне устраивает польская запись
спасибо, изучаю 🤙
ну задание такое ) сам бы я в жись для себя таким не занимался.
Проще всего сделать лексер, который будет выдавать токены, которые потом отдадутся парсеру, впоследствии получится дерево, проходя по его ветвям можно легко вычислять значения
чот сложно написано, пока что скила не хватит на такое )
Да просто сделай обработку по принципу компиля, да и всё
Только транслятора, а не компилятора
если я все правильно понял, то логика следующая объявляю генерик на инт и дабл перед функциями когда только приходит value некое делаю проверку генериком что там инт или дабл и потом делаю ветвление на 2 функции push_Int() и push_Double() так? или как мне сделать так, чтобы в аргумент функции поступало некое value(int или дабл)?
Нет, вместо своих строчек подставляешь сами вызовы функций
то что стоит под Y могу прописать уже внутри функции где буду вызывать что угодно да? а то я уже начал делать, думал это тоже в дефайне обязательно прописывать
Не понял вопроса
а, да я чот затупил. щас разобрался.
подсветка синтаксиса топ
А зачем нужна перегрузка, когда еще столько свободных имён ?
Обсуждают сегодня