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' 無効)」というメッセージも表示されます。

    nn =* 10.;

どんな助けでも大歓迎です。

4

1 に答える 1

5

nn *= 10.乗算nnされます10

nn = *10.10.エラーが言うように、は無効(doubleである)であるを逆参照しようとします。

間接参照に関して、最初の検索エンジンヒットは次のように述べています。

単項間接演算子(*)は、ポインターを間接参照します。つまり、ポインタ値をl値に変換します。間接演算子のオペランドは、型へのポインターでなければなりません。間接式の結果は、ポインター型の派生元の型です。

あなたの場合、オペランドは10.、doubleです。

于 2012-12-07T21:45:47.597 に答える