河野真治 @ 琉球大学情報工学です。

In article <20050224225102.18a5e5b9.forest@ma.kcom.ne.jp>, "K.Moriyama" <forest@ma.kcom.ne.jp> writes
>   説明では、あらかじめ以下の構造体を定義して有るので、
> 
>    static struct tGroupName  {
>            int iDummy ;
>            int iDummy2 ;
>    } ;                     <  ここに名前が無いのは変なのですが、
>                                    メーカ説明では、何も記載されて
>                               いません。

構造体の宣言なので、特に変ではないです。でも、このstatic
は無意味だと思う。

% gcc -Wall -c /tmp/aho1.c
/tmp/aho1.c:5: warning: useless keyword or type name in empty declaration

とコンパイラも言ってます。

>   ユーザで、以下のように宣言し、
>    static struct  tGroupName *pgUser ;

これは理解できます。

>   以下のように関数を使用する事により、
>    functionName ( &pgUser ) ;
>   以下のように値を得る事が出来る。
>    iUserVar = pgUser->iDummy ;
>   という説明になっているのです。

なるへそ。

>   で、上記ライブラリの動作を調べると、関数を使用した時にユーザが
> 定義した変数に値を返すのではなくて、あらかじめ確保してある領域の
> ポインタを返すような動作になっているのです。
>   それで、関数側でどうゆう処理をしているのかと、興味を持った
> 次第なのです。
> #   ちなみにコンパイラ自体もメーカ提供のもので、NECのPC-9801用
> # MS-DOSで使用する物です。

malloc して返すなら free しろって書いてあると思うので、きっと
static な領域をさしているんだろうな。昔のUnixにも、そんなAPI
あったような....

        static struct  tGroupName sUser ;

        void functionName ( struct tGroupName **pgUser ) 
        {
            *pgUser = &sUser;
        }

とか。あるいは、free するルーチンを使って、

        void openGroupName ( struct tGroupName **pgUser ) 
        {
            *pgUser = (struct tGroupName *)malloc(sizeof(struct tGroupName *)) ;
        }

        void closeGroupName ( struct tGroupName **pgUser ) 
        {
            free(*pgUser);
        }

みたいな。** が理解できるかどうかが問題ですけど... 

僕は、struct は、typedef と必ず併用しろって教えてます。

        typedef struct tGroupName  {
                int iDummy ;
                int iDummy2 ;
        } TGROUPNAME, *TGROUPNAME_PTR;

としてやれば、

        static TGROUPNAME sUser ;

        void functionName ( TGROUPNAME_PTR *pgUser ) 
        {
            *pgUser = &sUser;
        }

ってな感じ。** 使えない人には便利?

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科