C言語関係掲示板

過去ログ

No.194.別ソースの配列のサイズ


No.1224

別ソースの配列のサイズ
投稿者---しゅう(2002/03/08 17:54:42)


よろしくお願いします。

以下は、連想配列のFMemoryMapを初期化しようとしているコードなのですが、
初期化用テーブルが別ソースなので個数がわからず困っています。
自分で配列の個数を数えずに済むようにはできないでしょうか?

[data.h]
struct TMemoryData{
    unsigned long address;
    short         value;
};
extern TMemoryData MemoryInitTable[];

[data.cpp]
#include "data.h"
// 初期化用テーブル
TMemoryData MemoryInitTable[] = {
    // アドレス,  初期値
    { 0x00112233, 123  },
    { 0xAABBCCDD, 4444 },
    { 0x98765432, 55   },
    // この後もたくさん続く
};

[test.cpp]
#include "data.h"
void Test()
{
    for ( int i = 0; i < /*どうしよう…*/; i++ ) {
        unsigned long key   = MemoryInitTable[i].address;
        short         value = MemoryInitTable[i].value;
        FMemoryMap[key] = value;
    }
}



No.1225

Re:別ソースの配列のサイズ
投稿者---shu(2002/03/08 19:47:55)


以下は、連想配列のFMemoryMapを初期化しようとしているコードなのですが、
初期化用テーブルが別ソースなので個数がわからず困っています。
自分で配列の個数を数えずに済むようにはできないでしょうか?

[data.cpp]
#include "data.h"
// 初期化用テーブル
TMemoryData MemoryInitTable[] = {
    // アドレス,  初期値
    { 0x00112233, 123  },
    { 0xAABBCCDD, 4444 },
    { 0x98765432, 55   },
    // この後もたくさん続く
};



配列の要素数は、配列全体の大きさを、
1要素の大きさで割ることによって求める。

sizeof( MemoryInitTable ) / sizeof( TMemoryData )
全体の大きさ(配列名) ÷ 1要素の大きさ(1要素の型)
で、もとめられたと思いますよ。


No.1226

Re:別ソースの配列のサイズ
投稿者---kikk(2002/03/09 00:11:44)


ども。


> 初期化用テーブルが別ソースなので個数がわからず困っています。
> 自分で配列の個数を数えずに済むようにはできないでしょうか?

任意の型の配列array[]があったとすると、

sizeof array/sizeof array[0]

で、array[]の要素数が得られます。


では。

No.1229

Re:別ソースの配列のサイズ
投稿者---しゅう(2002/03/10 05:11:25)


お二人ともお答えありがとうございます。

ですが、これだと
error C2070: sizeof 式のオペランドが、識別子または型名になっていません。
というエラーが出てコンパイルできません。(VC++)

data.hの
extern TMemoryData MemoryInitTable[];

extern TMemoryData MemoryInitTable[3];
のように数指定すればコンパイルできますが、これだと意味がないです。

タイトルの"別ソースの"では伝わらなかったようでごめんなさい。


No.1230

Re:別ソースの配列のサイズ
投稿者---B.Smith(2002/03/10 12:03:23)


こんにちは。

配列の要素数を必要としない処理にしてしまうのも一つの手です。
処理順序に意味を持たない場合は、配列に番人を置くのも良いかもしれません。

一つの例として、文字列をグローバルで定義したとします。
char    Title[]    = "花より団子より酒";
char    FileName[] = "Temp.tmp";

これを別オブジェクトから使用する場合は、
extern char     Title[];
extern char     FileName[];

    printf("%s\n",Title);
    strcpy(Buf,Title);
    fopen(FileName,"w");
    _unlink(FileName);
            ・
            ・
            ・

文字列もchar型の配列ですが、この文字列を表示や処理に使用する時、ほとんどの場合文字列長を別に用意するようなことはしません。
お分かりの通り、文字列には番人として末尾にヌルがあるためで、処理として文字列長を知る必要が無いからです。

番人のメリットは、
データの追加が容易になる
多くのアルゴリズムに対して応用できる
等等.

例.アドレスにゼロを番人として指定した場合の例

/* 初期化用テーブル */
TMemoryData MemoryInitTable[] = {
    /* アドレス,  初期値 */
    { 0x00112233, 123  },
    { 0xAABBCCDD, 4444 },
    { 0x98765432, 55   },
            ・
            ・
            ・
    {0,-1}   /* 番人 */
};

void    Test()
{
    int           Idx;

    /* 番人はゼロ以外の数値でも良いのですが、ループの終了条件のような */
    /* 繰り返し行われる比較は、ゼロと行った方が効率的です。           */
    for (Idx = 0;MemoryInitTable[Idx].address;Idx++) {
        FMemoryMap[MemoryInitTable[Idx].address] =
                             MemoryInitTable[Idx].value;
    }
}




No.1233

Re:別ソースの配列のサイズ
投稿者---かずま(2002/03/11 00:05:57)


[data.h]
extern int MemoryInitTablesize;

[data.c]
int MemoryInitTableSize = sizeof MemoryInitTable / sizeof MemoryInitTable[0];

[test.cpp]
for (int i = 0; i < MemoryInitTableSize; i++) {



No.1234

Re:別ソースの配列のサイズ
投稿者---しゅう(2002/03/11 09:03:21)


B.Smithさん、かずまさんありがとうございました。
おかげで解決しました。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved