在μ控制器上进行C编程:printf()和FDEV_SETUP_STREAM?

时间:2012-01-07 06:10:42

标签: c file stream printf

编程计算器程序时,我遇到了两个绊脚石。虽然我从计算器中得到了正确的结果并且正确地打印了加法,减法和乘法,但我只是打印?符号来得到除法的结果。请参考下面的代码。

static void calculate(int *val1, int *val2, char *op){
float a = *val1;
float b = *val2;
float c = a/b;

   /*
   A stands for addition, B for sub, C for mul, D for div
   I have already verified that the right operation is being
   performed
   */

if(strcmp(op,"A")==0)
    {
    printf("%i \n\r", *val1+*val2);
}else if(strcmp(op,"B")==0)
    {
    printf("%i \n\r", *val1-*val2);
}else if(strcmp(op,"C")==0)
    {
    printf("%i \n\r", *val1 * *val2);
}else if(strcmp(op,"D")==0)
    {
    printf("%f \n\r", c);
}
}  

我使用真实术语来打印我的atmega 32微控制器的结果。

在调试器中,我确认当用户选择的操作是分区“D”时浮点c具有正确的值,但它似乎没有与之关联的小数点,尽管它是浮点数。

第二个问题:

我想知道我是否可以使用这样的字符数组(字符串):

//please note that below I am just simulating user keystrokes on a keypad attached to a
//microcontroller just for simplifying the problem.

  char a[20] = {1,2,3,4,5,\n};
  FILE keypad_str = FDEV_SETUP_STREAM(NULL, a, _FDEV_SETUP_READ);

我上面尝试的是尝试制定一项策略,让我能够立即打印出每个用户键,而不是keypad_str stdin然后打印出整个字符串用户在屏幕上输入的命令。

2 个答案:

答案 0 :(得分:2)

在进行除法之前,您不会检查除以零。

即使操作是加法或减法或乘法,也不清楚为什么总是进行除法。你应该只在必要时进行分工:

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保留到位,因为它可以更轻松地调试值。

这些都不能解释问号输出。

(你是否必须告诉Atmega 32微控制器上的C编译器是否包含对库中浮点的支持?这可能是问号所在。)

我会选择字符串"+""-""*""/"作为操作的助记符;我不打算用评论来解释这些操作意味着什么。

通常,您不会在格式中包含回车符。当你这样做时,它通常在换行符之前,而不是在换行符之前。还不清楚为什么要在输出行的末尾留空。

关于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";

这强调了差异(并且不,双重零并非严格必要,但有助于说明这一点。)

答案 1 :(得分:1)

对于您的问题-1,存在多个问题,因此我将您的程序重新编写到以下

#include <stdio.h>

static void calculate(int val1, int val2, char op) 
{
    switch(op) {
        case 'A':
            printf("%d+%d = %d \n", val1, val2, val1 + val2);
            break;
        case 'B':
            printf("%d-%d = %d \n", val1, val2, val1 - val2);
            break;
        case 'C':
            printf("%d*%d = %d \n", val1, val2, val1 * val2);
            break;
        case 'D':
            if (val2 == 0) {
                printf("can't divide by 0\n");
                break;
            }                     
            printf("%d/%d = %.2f \n", val1, val2, (float)val1/(float)val2);
            break;
        default:
            break;
    }   

    return;
}  

int main(void) 
{
    int a = 10, b = 20; 
    char op = 'D';
    calculate(a, b, op);
    op = 'A';
    calculate(a, b, op);
    return 0;
}

输出:

$ ./a.out 
10/20 = 0.50 
10+20 = 30  
$ 

W.r.t question-2:

char a[20] = {1,2,3,4,5,\n};

无效,实际上应该如下

char a[20] = {'1', '2', '3', '4', '5', '\n'};