2017-01-25 5 views
0

私は式へのポインタを取得する関数を持っていて、コードはアドレスが大きくなる(式++)ので、関数が2つに分割されたいポインタへのポインタを使用しなければならなかった、私はそれが間違って使用したと思うので、今私のコードは無限ループを持っています。ここで私は分割したい機能は、機能を助けるために続いている:関数を2つの関数に分割したい

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; 
} 

は私がやったことですが、私は内のポインタへのポインタを定義しその方法の主な機能:

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); 

} 

と私は(分割後)その他の機能を変更する方法thatsの、新しい機能が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; 
} 

は私が間違っている可能性が何をしただろうか?あなたのIs_Num

+0

質問には関係ありませんが、なぜ['isdigit'](http://en.cppreference.com/w/c/string/byte/isdigit)を再発明していますか? –

+0

私はコード内のすべてのヘルプ機能を記述する必要があります。私は準備関数を使用することはできません。 –

答えて

2

はそれを取得ポインタ、ない指示先を変更します。外側の文脈でポインタを変更するには、このような何かをする必要があります:あなたはconstとして取得ポインタをマーキング

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

も良いアイデアです。それはあなたがそれを変更するのを防ぎ、常に同じオブジェクトを参照するようにします。

+0

まあ、私はあなたが言ったことを考えようとしていますが、これが無限ループの原因であるかどうかを確認するために、私は何を提案したのか、無限ループはまだ存在します。 –

+0

@FirasAliAbdelGhani - あなたの無限ループは、「奥行き」がうまくバランスのとれた表現で1になることはないからです。 – StoryTeller

+0

深さを変えたループ全体をキャンセルしようとしましたが、それと同じ問題です。以前は深さを使った方法に違いはありませんでした。正常に動作する前に、何かを違法に使うようです。値のprintfを入れて何かが同じ値を得ているかどうかを調べる。何も印刷されていない。 –

関連する問題