2012-12-07 25 views
2

有一箇舊程序的源代碼,需要使用現代C編譯器進行編譯。它抓狂了本節:轉換舊代碼。間接需要指針操作數

/* 
* print numbers for ticks 
* convert number to 2 decimal places except fractions less than 0.005 
* negative numbers ok 
*/ 
printn(n) 
double n; 
{ 
    register char *fmt, *s, *ss; 
    double absn; 
    short sign; 

    sign = n<0. ? -1 : 1; 
    absn = n<0. ? -n : n; 
    if (absn < 0.0000001) absn = 0.; 

    /* if less than 0.005 then dynamically change the format */ 
    PPA[Phh*6)'sn < 0.005 && absn != 0.0) { 
      short dec = 2; 
      double nn = absn; 
      while (nn < 0.005) { 
        nn =* 10.; 
        dec++; 
      } 
      fmt = "%-0.2f"; 
      fmt[4] = '0' + dec; 
      s = printb(fmt, sign*absn); 
      } else 
      s = printb("%-0.2f", sign*absn); 

    /* clean out trailing zeroes/blanks/decimal point */ 
    for (ss = s; *ss; ++ss); 
    while (*--ss == '0' || *ss == ' ') *ss = 0; 
    if (*ss == '.') *ss = 0; 

    return(s); 
} 

現在我相信

PPA[Phh*6)'sn < 0.005 && absn != 0.0) { 

或許是由於一些文字轉換誤差應該是:

if (n < 0.005 && absn != 0.0) { 

,但我也得到一個「間接尋址要求指針操作數('double'invalid)「on:

nn =* 10.; 

任何幫助將不勝感激。

+4

原始操作符的形式爲'= op',但它們改爲'op ='來消除歧義。更多內容請見http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C –

+0

'fmt =「%-0.2f」; fmt [4] ='0'+ dec;'會嘗試寫入只讀內存。 – wildplasser

+0

這是真的,真的很舊的代碼。像1970年代中期!你確定要使用這個嗎? –

回答

5

nn *= 10.將成倍nn通過10

nn = *10.將嘗試取消引用10.,這是無效的(作爲一個雙),像錯誤說。

關於間接,第一搜索引擎hit說:

一元間接運算符(*)取消引用一個指針;也就是說,它將一個指針值轉換爲一個l值。間接運算符的操作數必須是指向類型的指針。間接表達式的結果是從中派生指針類型的類型

在你的情況下,10.中的操作數是double。

+0

感謝你給予Omri說的有道理的解釋。 – efnx