我想将一个函数分成两个函数

时间:2017-01-25 08:20:22

标签: c pointers infinite-loop

我有一个函数获取指向表达式的指针,并且通过代码增加地址(表达式++),我想将函数拆分为两个,因为它太长了,但我不得不使用指针指针,我认为我错了,因为现在我的代码有一个无限循环。这是我想拆分的功能,然后帮助功能:

char CalculateExpression(char *expression, char *LEFT, char *RIGHT){

int i,depth;

expression++;

if (Is_Digit(expression))
{
    i=0;
    while(Is_Digit(expression))
    {
        LEFT[i] = *expression;
        i++;
        expression++;
    }
}

else
{

    i=0;
    LEFT [i] = *expression;
    i++;
    expression++;

    depth = 1;
    while(depth > 0)
    {
        if (*expression == '(')  depth++;

        if (*expression == ')')  depth--;

        LEFT[i] = *expression;
        i++;
        expression++;
    }

}
LEFT[i] = 0;

char OPERATION = *expression;

expression++;


i=0;

while (*(expression+1))
{
    RIGHT[i] = *expression;
    i++;
    expression++;
}

RIGHT[i] = 0;

return OPERATION;}

这里有两个帮助功能:

  bool Is_Digit(char *c)
{
    return (*c >= '0' && *c <= '9');
}

bool Is_Num(char *exp)
{
    while(*exp)
    {
        if (!Is_Digit(exp++))   return false;
    }
    return true;
}

这就是我所做的,我以这种方式在main函数中定义了指向指针的指针:

   bool calculate_modular_expression(unsigned int modulus, char* expression,
                                  unsigned int* expression_result)
{

     char** expression_after;
        expression_after= &expression;
        CalculateExpression(expression,Left_To_Operation,
                                             Right_To_Operation,expression_after);

}

那就是我如何改变其他功能(拆分后),新功能被称为Left_Operand:

int Left_Operand(char *LEFT, char *RIGHT,char** expression_after)
{
    int i,depth;

    if (Is_Digit(expression_after))
    {
        i=0;
        while(Is_Digit(expression_after))
        {
            LEFT[i] = **expression_after;
            i++;
            expression_after++;
        }
    }

    else
    {

        i=0;
        LEFT [i] = **expression_after;
        i++;
        expression_after++;

        depth = 1;
        while(depth > 0)
        {
            if (**expression_after == '(')  depth++;

            if (**expression_after == ')')  depth--;

            LEFT[i] = **expression_after;
            i++;
            expression_after++;
        }

    }

    LEFT[i] = 0;



}



char CalculateExpression(char *expression, char *LEFT, char *RIGHT,char** expression_after)
{
    int i,depth;

    expression++;


      Left_Operand(LEFT,RIGHT,expression_after);


    expression = *expression_after;

    char OPERATION = *expression;

    expression++;


    i=0;

    while (*(expression+1))
    {
        RIGHT[i] = *expression;
        i++;
        expression++;
    }

    RIGHT[i] = 0;

    return OPERATION;
}

最后更改后的帮助功能:

bool Is_Digit(char **c)
{
    return (**c >= '0' && **c <= '9');
}


/*this char returns true if an expression is a number*/

bool Is_Num(char **exp)
{
    while(**exp)
    {
        if (!Is_Digit(exp++))   return false;
    }
    return true;
}

我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

您的Is_Num修改了它获取的指针,而不是指针。要修改外部上下文中的指针,您需要执行以下操作:

bool Is_Num(char ** const p_exp)
{
    while(**p_exp)
    {
        if (!Is_Digit((*p_exp)++))   return false;
    }
    return true;
}

将指针标记为const也是一个好主意。它会阻止您修改它,从而确保您始终引用同一个对象。