Re: 構造体をポィンタで使用する とエラーとなる
河野真治 @ 琉球大学情報工学です。
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
河野真治 @ 琉球大学工学部情報工学科
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735