2017-01-25 5 views
0

У меня есть функция, которая получает указатель на выражение, а через код адрес увеличивается (выражение ++), я хочу разделить функцию на две, потому что она слишком длинная, но я должен был использовать указатель на указатель, и я думаю, что я использовал его неправильно, потому что теперь мой код имеет бесконечный цикл. здесь это функция, я хочу разделенное затем, чтобы помочь функции:Я хочу разбить функцию на две функции

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

} 

и то, как я изменил другие функции (после раскола), новая функция называется 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; 
} 

что, возможно, я мог бы сделать неправильно?

+0

Не связано с вашим вопросом, но почему вы изобретаете ['isdigit'] (http://en.cppreference.com/w/c/string/byte/isdigit)? –

+0

Мне нужно написать каждую функцию справки в коде, я не могу использовать готовые функции. –

ответ

2

Ваш Is_Num изменяет указатель он получает, а не pointee. Для того, чтобы изменить указатель во внешнем контексте, что вам нужно сделать что-то вроде этого:

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

Маркировка указателя вы получаете как const также является хорошей идеей. Это не позволяет вам его модифицировать, поэтому вы всегда обращаетесь к одному и тому же объекту.

+0

ну, я пытаюсь думать о том, что сказал, но чтобы проверить, не вызывает ли это то, что вызывает бесконечный цикл, я сделал то, что предложил, бесконечный цикл все еще существует, может быть, из-за неправомерного способа достижения памяти. –

+0

@FirasAliAbdelGhani - Ваш бесконечный цикл - это потому, что 'depth' никогда не идет ниже 1 в хорошо сбалансированном выражении. – StoryTeller

+0

Я попытался отменить весь цикл, который включает глубину, по-прежнему та же проблема, нет никакой разницы в том, как я использовал глубину до и сейчас, прежде чем она работала нормально, опять же, это похоже на незаконное использование чего-то, потому что я пытался поместите printf значений, чтобы увидеть, что что-то продолжает получать одинаковое значение, ничего не было напечатано. –