繁体   English   中英

C ++程序陷入循环

[英]C++ Program stuck in a loop

因此,该程序应采用字符串并将其转换为反向波兰表示法,然后为其生成汇编代码。

例如。 如果我输入“ x = y”,程序将返回

“ RPN:xy =”

“代码:1个y 2 sto x”

但是,该程序将返回乱码并继续这样做,直到耗尽内存。

这是输入功能

void 
getstring()
{
    if(datafile) {
        file.getline(str,241);
        }else{
            cout << "Enter a string, please \n\n";
            cin.getline( str, 241);
            }
            nstring++;
}

这些是与之配合使用的功能。

void 
internalize()
{
    int i, j;
    static char inter[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 6, 4, 0, 5, 0, 7,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
                           0,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
                           23,24,25,26,27,28,29,30,31,32,33, 0, 0, 0, 0, 0,
                           0,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
                           49,50,51,52,53,54,55,56,57,58,59, 0, 0, 0, 0, 0};
        char ch, code, k, *p, *q;
        cout << "internal form: \n\n";
        k=0;
        q=inform;
        for(p=str;*p;p++){
            *q++ = code = inter[(int)*p];
                if(k+code == 0){
                    k = p-str+1;
                    ch = *p;
                    }
            }
        *q = 0;
        for(i=j=0, p = inform;p++,j++;j<len){
        cout << setw(3) << (int)*p;

            if(++i == 16){
                cout << '\n';
                i = 0;
                }
        }   
        if (i !=0){
        cout <<'\n';
        }
        if((err = (0<k))!=0){
        cout << '\n**' << (int)k << "-th nonblank char <" <<ch<<"> is illegal. **\n";
        }
}

void
makerpn()
{
    static char pr[]={0,0,1,2,3,3,4,4};

    char n, *p, *r, s, *t;
    cout << "\nRPN:\n\n";
    t = stak - 1;
    r = rpn;

    for (p = inform;p++ ; *p){
        if(7 < (s = *p)){
        *r++ = s;
        //a
        }else if(s == 1){
            *++t = s;
        } else{
            while(1){
                if(t<stak){
                    *++t = s;
                    break;
                } else if(pr[s] <= pr[n = *t--]){
                *r++ = n;
                } else if(3 < n+s){
                    *++t = n;
                    *++t = s;
                }
            break;  
            }
    }   
        while(stak <= t){
        *r++ = *t--;
        }
        *r = '\0';
        for(r=rpn;*r;r++){
            cout << ext[(int)*r];
        }
        cout << "\n\n";     
}}

void
gencode()
{
        void emit(char, char);
        char a,j,lop,n1,n2,*p,*t;       
        cout << "Generated symbolic code \n\n";
        j = len = lop = 0;
        t = p = rpn;

            while(3 <(a = *++p)){           
                if(7 <a){
                    *++t = a;
                        if((++lop == 2) && (0<len)){
                        n2=*t--;

                        n1=*t--;
                        *++t=j+60;
                        *++t=n1;
                        *++t=n2;
                        emit(2,(j++)+60);
                        }
                }else {
                    if(lop == 1){
                    emit(a,*t--);
                        }else{ 
                            if( 1 < lop){
                            n2 = *t--;
                            n1 = *t--;
                            emit(1,n1);
                            emit(a,n2);
                            }else {
                                if((a==4) || (a==6)){
                                    n1 = *t--;
                                    emit(a,n1);
                            }else {      
                                n1=*t--;
                                emit(2,j+60);
                                emit(1,n1);
                                emit(a,j+60);
                                if( 59 < n1){
                                    --j;}}}}}}  
                        lop = 0;
}

我猜循环有问题,但是我不确定是什么。 我已经调整了一段时间,我设法做的就是让它重复Hp? 而不是一遍又一遍的硬件。

for (p = inform;p++ ; *p)将持续到下一个值pnullptr ,每个轮将间接引用p和丢弃的结果-你大概这意味着周围的其他方法。

情况类似: for(i=j=0, p = inform;p++,j++;j<len) ,它将继续运行直到j++变为0并在每次迭代时丢弃比较结果j<len

通常,这里实际上只有一个问题:您的代码确实非常难以阅读。 尝试将其分解为可管理的大块,并验证每个小块是否在执行您想要的操作。 这样,如果只有一个块没有执行您想要的操作,则可以将其识别出来,并明确要求该块而不是转储整个程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM