パスワードを忘れた? アカウント作成
625126 journal

ttの日記: ああなんか自信なくなってきた 2

日記 by tt
ので、偉い人教えてください。

extern const int s1bits[16], s2bits[16];

void
scfsi_calc(int *p, int s1, int s2, int c1, int c2)
{
    int i;
    for (i = 0; i < 16; i++) {
        if (s1 <= s1bits[i] && s2 <= s2bits[i]) {
            int c = s1bits[i] * c1 + s2bits[i] * c2;
            if (p[0] > c) {
                p[0] = c;
                p[1] = i;
            }
        }
    }
}

ってのを、ix86向けにコンパイルしたgcc3.4に、-O -funswitch-loops (あるいは-O3)というコンパイルオプションをつけてコンパイルすると、間違えたコードが生成されます。どうも、s1bits[]とかs2bits[]の全要素が同じ値であると仮定したようなコードになります。-funswitch-loops がなければ問題はおきません。

ところが、一番最初の外部変数の宣言文を

extern int s1bits[16], s2bits[16];

だとか

const int s1bits[16], s2bits[16];

だとかにすると、正しいコードになります。

もしかして、extern const って、そんな意味あったんでしょうか…(汗)。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2004年04月26日 7時10分 (#538147)
    constを付けるとlvalueにできないだけです。externで外から配列持ってきているので、storageの省略もできないし( int const a = 5のような場合で&aのようなアクセスがない場合はコンパイラはaを入れるstorageを省略できる)。メモリマップされたステータスレジスタはconst volatileだしね。
    • by tt (2867) on 2004年05月05日 14時49分 (#541739) 日記
      ばしっと言い切っていただきありがとうございます。安心しました。最近久々にまじめにCの規格を読み出して、自分がかなり誤解していたことを再認識しておりまして、あらゆることが信じられない状態だったのです。

      ということで、安心してレポートあげたいと思います。どうもありがとうございました。

      --
      -- Takehiro TOMINAGA // may the source be with you!
      親コメント
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...