2015-05-21 31 views
0

所以這個程序應該接受一個字符串並將其轉換爲反向波蘭表示法,然後爲其生成彙編代碼。C++程序卡在循環中

例如。如果我是輸入 「X = Y」 時,程序將返回

「RPN:XY =」

「代碼: 1個LODý 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?而不是一遍又一遍的硬件。

+0

TL; DR!請嘗試縮小到您遇到問題的相關代碼,或者創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們顯示。另外,請嘗試提出一些好的和描述性的變量名稱。例如,什麼是「a」?它應該代表什麼?變量的目的是什麼? –

+0

在makerpn()中你有:for(p = inform; p ++; * p) – kyle

+0

在簡潔和隱晦之間有一條細線,而你距離它近一英里。 – molbdnilo

回答

4

for (p = inform;p++ ; *p)將持續到p下一個值是nullptr,每個輪將間接引用p和丟棄的結果 - 你大概這意味着周圍的其他方法。

類似的是這種情況:for(i=j=0, p = inform;p++,j++;j<len)將繼續運行,直到j++變得0並丟棄對比j<len每次迭代的結果。

一般來說,這裏真的只有一個問題:你的代碼真的很難閱讀。嘗試將其分解成可管理的塊,並驗證每個人正在做你想要的。這樣,如果仍然有一個塊沒有按照你的要求做,你可以識別它,並專門要求那個塊而不是傾銷整個程序。