Вы не проверяете деление на ноль перед выполнением деления.
Не ясно, почему вы всегда делите, даже если операция является сложением, вычитанием или умножением.Делать это следует только тогда, когда это необходимо:
else if (strcmp(op, "D")==0)
{
float a = *val1;
float b = *val2;
if (*val2 == 0)
printf("Divide by zero error\n");
else
{
float c = a / b;
printf("%f\n", c);
}
}
Я оставил переменную c
на месте, поскольку это облегчает отладку значений.
Ничто из этого не объясняет вопросаОтметить вывод.
(Нужно ли указывать компилятору C на микроконтроллере Atmega 32 включить поддержку плавающей запятой в библиотеке? Это может объяснить вопросительный знак.)
Я бывыбрали строки "+"
, "-"
, "*"
и "/"
в качестве мнемоники для операций;Тогда я бы не стал комментировать, объясняя, что означают операции.
Обычно вы не включали бы возврат каретки в формате.Когда вы это делаете, он обычно предшествует, а не следует за новой строкой.Также непонятно, зачем вам нужен пробел в конце строк вывода.
Некоторые вопросы о FDEV_SETUP_STREAM () требуют знаний, которых у меня нет.
ОднакоКомпилятор C должен сообщить вам, что:
char a[20] = {1,2,3,4,5,\n};
недопустимо.Вы можете иметь в виду любой из них;оба они действительны, но довольно различны:
char a[20] = { 1, 2, 3, 4, 5, '\n' };
char a[20] = { '1', '2', '3', '4', '5', '\n' };
Приведенные выше инициализаторы могут быть сокращены до:
char a[20] = "\001\002\003\004\005\n";
char a[20] = "12345\n";
Это подчеркивает разницу (и нет, двойные нули не являютсястрого необходимо, но помогите сделать точку).