【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.20205

配列の初期化子数を固定したい
投稿者---chu-(2005/03/02 11:50:49)


環境:LSI-C

例えばArray[5]と宣言したとき、初期化子を6個以上指定するとエラーがでますが、
4個以下のときにはエラーが出ません。
5個でないときは全てエラーとしたいのですが、何かよい方法はないでしょうか。
実行時ではなく、コンパイル時に要素数が正しくないことを知りたいと思っています。
[ソース]
#include <stdio.h>

#define SIZE 5

const short Array[SIZE] = {
/*  1001, /* 誤ってこの行を削除してしまったことをコンパイル時に知りたい */
    1002,
    1003,
    1004,
    1005,
};

/*#if sizeof(Array)/sizeof(short) != SIZE   /* sizeofは使用不可 */
#if 1
#error Arrayの要素数が正しくない
#endif

int main(void)
{
    int i;
    for ( i = 0; i < SIZE; i++ ) {
        printf("[%d]:%d\n", i, Array[i]);
    }
    return 0;
}

[実行結果]
プロンプト>lcc test
test.c 16: #error: Arrayの要素数が正しくない

プロンプト>test
[0]:1002
[1]:1003
[2]:1004
[3]:1005
[4]:0



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列の初期化子数を固定したい 20209 Craft 2005/03/02 12:14:30
<子記事> Re:配列の初期化子数を固定したい 20212 chu- 2005/03/02 13:52:00


No.20209

Re:配列の初期化子数を固定したい
投稿者---Craft(2005/03/02 12:14:30)


コンパイラのコンパイルオプションにこのチェックをするオプションがないのであれば、コンパイル時に検出することは不可能です。
(そもそも、初期化子数が少ないことはC的には文法違反ではないので、よほど厳格なCコンパイラでもないかぎり、存在しないと思いますが・・)

静的初期化は、処理実行上前提となるものを「あらかじめ」設定するわけですから、机上デバッグ等で解消すべきだと思います。

ソースを自力チェックしてコーディングミスを検出する癖をつけることをおすすめします。


この投稿にコメントする

削除パスワード

No.20212

Re:配列の初期化子数を固定したい
投稿者---chu-(2005/03/02 13:52:00)


前にどこかで見たアイデア(0がヌルポインタに変換されることを利用する)を思い出し、
それを応用して解決することができました。
ありがとうございました。
[ソース]
#include <stdio.h>

#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))

#define SIZE 5

/* ※1:要素数はコンパイラに数えさせるために記述してはいけない */
const short Array[] = {
    1001,
/*  1002, /* 誤ってこの行を削除してしまったことをコンパイル時に知りたい */
    1003,
    1004,
    1005,
};

/* ※2:0以外はポインタ型とならないので警告が出る */
const void *ArraySizeCheck = ARRAYSIZE(Array)-SIZE;

int main(void)
{
    int i;
    for ( i = 0; i < SIZE; i++ ) {
        printf("[%d]:%d\n", i, Array[i]);
    }
    return 0;
}

[実行結果]
プロンプト>lcc test
test.c 17: 警告: ポインタの型が合わない (initializer)

プロンプト>test
[0]:1001
[1]:1003
[2]:1004
[3]:1005
[4]:-1



この投稿にコメントする

削除パスワード

No.20214

Re:配列の初期化子数を固定したい
投稿者---かずま(2005/03/03 01:23:36)


警告が出ればいいというのであれば、これでもいいということですね。
int ArraySizeCheck = 1 / !(ARRAYSIZE(Array)-SIZE);



この投稿にコメントする

削除パスワード

No.20217

Re:配列の初期化子数を固定したい
投稿者---chu-(2005/03/03 11:10:17)


なるほど、これもいろいろと応用できそうなテクニックですね。
憶えておきます、ありがとうございました。


この投稿にコメントする

削除パスワード

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