掲示板ランキング  靴下・ストッキング(ひきしめ用靴下)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7047

ポインタの配列の初期化
投稿者---chu-(2007/01/31 11:24:07)


下記[test.c]が下記[コンパイル結果]のように失敗します。

あれこれ試していると、変数a,b,cをstaticに変更するとコンパイルできることがわかりました。
しかし、auto変数だと失敗する理由がわかりません。

hairetuがstaticならばa,b,cもstaticでないといけないでしょうが、
hairetuがautoなんだからa,b,cもautoでいいように思います。

[test.c]
/*
 * No.29658 関数(データの引渡し)投稿者---kasai(2007/01/31 08:50:53)
 * http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+29658
 */
#include <stdio.h>

void smp(int **hairetu);

int main(void)
{
    int a=10;
    int b=20;
    int c=30;
    int *hairetu[] = {&a, &b, &c};

    smp(hairetu);

    printf("%d %d %d", a, b, c);

    return 0;
}

void smp(int **hairetu)
{
    int i;
    hairetu++ ;
    for(i=1;i<3;i++,hairetu++){
        **hairetu *= 10;
        **hairetu += **(hairetu-1);
    }
}

[コンパイル結果] 環境:Win2000, LSI C-86 Compiler ver 3.30c, Borland C++ 5.5 for Win32
>lcc test.c
test.c 9: non-constant expression
test.c 9: non-constant expression
test.c 9: non-constant expression

>bcc32 test.c
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2063 test.c 14: 不正な初期化(関数 main )
*** 1 errors in Compile ***

>



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタの配列の初期化 7048 sticky-bit 2007/01/31 11:33:16
<子記事> Re:ポインタの配列の初期化 7054 かずま 2007/01/31 19:55:34
<子記事> Re:ポインタの配列の初期化 7056 chu- 2007/02/01 11:18:58


No.7048

Re:ポインタの配列の初期化
投稿者---sticky-bit(2007/01/31 11:33:16)


>しかし、auto変数だと失敗する理由がわかりません。

おそらく、Borland C++ CompilerとLSI C-86が抱えているバグだと思います。

コンパイラといえどもソフトウェアの一種ですから、
何らかの問題を含んでいるのは致し方ないのでありましょう。


この投稿にコメントする

削除パスワード

No.7051

Re:ポインタの配列の初期化
投稿者---sticky-bit(2007/01/31 11:42:37)


>おそらく、Borland C++ CompilerとLSI C-86が抱えているバグだと思います。

補足情報です。
http://qc.borland.com/wc/qcmain.aspx?d=1718
C++でコンパイルすれば、staticじゃなくてもOKです。
当方でも確認しました。

LSI C-86の、本件に関するバグ情報は未確認です。


この投稿にコメントする

削除パスワード

No.7052

Re:ポインタの配列の初期化
投稿者---Blue(2007/01/31 13:28:25)


>おそらく、Borland C++ CompilerとLSI C-86が抱えているバグだと思います。
最近おなじレスをしました。(バグではないらしい)
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1503


この投稿にコメントする

削除パスワード

No.7053

Re:ポインタの配列の初期化
投稿者---sticky-bit(2007/01/31 13:31:54)


>最近おなじレスをしました。(バグではないらしい)

くだんのスレッドの下の方(新しい発言)を確認しておりませんでした。
失礼をいたしました。


この投稿にコメントする

削除パスワード

No.7054

Re:ポインタの配列の初期化
投稿者---かずま(2007/01/31 19:55:34)


> hairetuがstaticならばa,b,cもstaticでないといけないでしょうが、
> hairetuがautoなんだからa,b,cもautoでいいように思います。

JIS X3010-1993 (ISO/IEC 9899:1990) --- ANSI C
6.5.7 初期化
 静的記憶域期間をもつオブジェクトの初期化子, 又は集成体型若しくは共
用体型をもつオブジェクトの初期化子並びにおいて, すべての式は定数式で
なければならない。

hairetu は配列型ですから、集成体型です。
a が static のとき、&a はアドレス定数で定数式ですが、
a が auto のとき、&a は定数式ではありません。

なお、int a; int *p = &a;は、エラーになりません。
p が集成体ではないからです。

C99 からこの制約はなくなりました。

JIS X3010:2003 (ISO/IEC 9899:1999) --- C99
6.7.8 初期化
制約
 静的記憶域期間をもつオブジェクトの初期化子の中のすべての式は定数式
又は文字列リテラルでなければならない。


なお、C++ はどんな staticなオブジェクトも、定数式以外で初期化できます。


この投稿にコメントする

削除パスワード

No.7056

Re:ポインタの配列の初期化
投稿者---chu-(2007/02/01 11:18:58)


返信ありがとうございます。

> JIS X3010-1993 (ISO/IEC 9899:1990) --- ANSI C
> 6.5.7 初期化
>  静的記憶域期間をもつオブジェクトの初期化子, 又は集成体型若しくは共
> 用体型をもつオブジェクトの初期化子並びにおいて, すべての式は定数式で
> なければならない。

なるほど、そう決められていたんですね。
すっきりしました。

[test.c] 条件:C89
#include <stdio.h>

int main(void)
{
    int val = 1;                    /* valがautoなので&valは非定数(変数の配置アドレスが一意に決定しない) */

    {
        static int *ptr = &val;     /* ptrは“静的記憶域期間をもつオブジェクト”なのでコンパイルエラー */

        printf("%d\n", *ptr);
    }

    {
        int *ary[] = { &val };      /* aryは“集成体型若しくは共用体型をもつオブジェクト”なのでコンパイルエラー */

        printf("%d\n", *ary[0]);
    }

    {
        struct {
            int *ptr;
        } st = { &val };            /* stは“集成体型若しくは共用体型をもつオブジェクト”なのでコンパイルエラー */

        printf("%d\n", *st.ptr);
    }

    {
        union {
            int *ptr;
        } uni = { &val };           /* uniは“集成体型若しくは共用体型をもつオブジェクト”なのでコンパイルエラー */

        printf("%d\n", *uni.ptr);
    }

    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ