C言語関係掲示板

過去ログ

No.360.引数の構造体配列のアドレスから要素数を求めたい

[戻る] [ホームページ]
No.2358

引数の構造体配列のアドレスから要素数を求めたい?
投稿者---YUZAWA(2002/08/13 10:20:54)


はじめまして
関数で引数に構造体配列の先頭アドレスを受け取った場合、
呼ばれた関数側で要素数を知る方法はあるのでしょうか?

// さんぷるソース

sub(struct dmmy_tag *);
struct dmmy_tag
{
    int a1;
    int a2;
    char a3;
};
main()
{
    struct dmmy_tag b[3];
    sub(b);
}
sub(struct dmmy_tag *b_adr)
{
  /*   この中で配列要素数 3を知りたい場合
    どのように求めるのがよりよいか?*/
}


No.2360

Re:引数の構造体配列のアドレスから要素数を求めたい?
投稿者---TDa(2002/08/13 10:42:39)


こんにちは。

お望みのものは次のマクロのようなものでは無いでしょうか。

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

int main(int argc, char *argv[])
{
    int a[5];
    double b[10];
    char s[8];
  
    printf("%d, \%d, %d\n", NELEM(a), NELEM(b), NELEM(s));
    
    return 0;
}


No.2361

Re:引数の構造体配列のアドレスから要素数を求めたい?
投稿者---YUZAWA(2002/08/13 10:52:42)


早速返信ありがとうございます。
しかしこのマクロを例のようなsub関数の中で使うと
分子sizeof(array)の部分がポインタのサイズになってしまいます。
main関数のみに閉じていればマクロを使い定数と記述しないですむので
かなり有効です。ありがとうございます。

>こんにちは。
>
>お望みのものは次のマクロのようなものでは無いでしょうか。
>
>
#define NELEM(array)    (sizeof(array)/sizeof(array[0]))

int main(int argc, char *argv[])
{
    int a[5];
    double b[10];
    char s[8];
   
    printf("%d, \%d, %d\n", NELEM(a), NELEM(b), NELEM(s));
    
    return 0;
}



No.2364

Re:引数の構造体配列のアドレスから要素数を求めたい?
投稿者---TDa(2002/08/13 11:57:05)


>しかしこのマクロを例のようなsub関数の中で使うと
>分子sizeof(array)の部分がポインタのサイズになってしまいます。
>main関数のみに閉じていればマクロを使い定数と記述しないですむので
>かなり有効です。ありがとうございます。

誤解しておりました。一般的には配列を渡すときには実際にはその先頭要素をさ
すポインタを渡しますので呼び出され側でそのサイズを直接知ることは不可能で
す。

ですので要素数を引数として渡したり有効な最後の要素の次に印をおいたりしますね。今回の場合でしたら

sub(struct dmmy_tag *b_adr, int arraySize);
として呼び出し側で
sub(array, NELEM(array));
というようにするのが定石だと思います。


No.2365

Re:引数の構造体配列のアドレスから要素数を求めたい?
投稿者---YUZAWA(2002/08/13 12:02:57)


なるほど!目からうろこです。
そうですよね。引数を一つ増やして要素数も与えてあげればいいですね!
ありがとうございました!!
>>しかしこのマクロを例のようなsub関数の中で使うと
>>分子sizeof(array)の部分がポインタのサイズになってしまいます。
>>main関数のみに閉じていればマクロを使い定数と記述しないですむので
>>かなり有効です。ありがとうございます。
>
>誤解しておりました。一般的には配列を渡すときには実際にはその先頭要素をさ
>すポインタを渡しますので呼び出され側でそのサイズを直接知ることは不可能で
>す。
>
>ですので要素数を引数として渡したり有効な最後の要素の次に印をおいたりしますね。今回の場合でしたら
>
>sub(struct dmmy_tag *b_adr, int arraySize);
>として呼び出し側で
>sub(array, NELEM(array));
>というようにするのが定石だと思います。



No.2366

素朴な質問
投稿者---はじめ(2002/08/13 15:14:11)


#include <stdio.h>
#include <strings.h>

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

struct dmmy_tag
{
int a1 ;
int a2 ;
char a3 :
} ;
main()
{
struct dmmy_tag b[3] ;

printf("%d\n",sizeof(b)) ;
printf("%d\n",sizeof(b[0])) ;
sub(*b, NELEM(b)) ;
}
sub(struct dmmy_tag *b_adr, int arraySize)
{
printf ("%d\n",arraySize) ;
}

を実行すると要素数は「3」と取得できるのですが、
sizeofで全体のサイズを取得すると、int型+int型+char型で、9*3=27に
なると思うですが、36となります。また、要素のサイズを求めると、12
となります。
どうしてなのでしょうか。

また、
「char a3」を除いた構造体で行うと、
要素数が「0」となるのですが、どうしてなのでしょうか。


No.2367

Re:素朴な質問
投稿者---YUZAWA(2002/08/13 16:21:51)


>「char a3」を除いた構造体で行うと、
>要素数が「0」となるのですが、どうしてなのでしょうか。
これは自分の環境だと3になります。
関係ないかも知れませんがsubの呼び出す時の引数が*bになってます。
sub(b,NELEM(b))かな?サンプルとはいえプロトタイプ宣言はすべきでした。
ごめんなさい。


No.2369

Re:素朴な質問
投稿者---はじめ(2002/08/13 18:05:56)


>>「char a3」を除いた構造体で行うと、
>>要素数が「0」となるのですが、どうしてなのでしょうか。
>これは自分の環境だと3になります。
>関係ないかも知れませんがsubの呼び出す時の引数が*bになってます。
>sub(b,NELEM(b))かな?サンプルとはいえプロトタイプ宣言はすべきでした。
>ごめんなさい。

すいません、subの読み出し方が違っていました。
実体が存在するアドレスを渡すのに、ポインタにしてはまずいですね。
何を渡してるんだか。?
sub(b,NELEM(b))としたら「3」になりました。