Re: 構造体をポィンタで使用するとエラーとなる
森山です。
神戸さん、河野さん、ありがとうございます。
ポインタ型で宣言した後に、領域の確保を行うのですね。
# そう思って、入門書を読むと[ 実行時に、malloc 関数を使用して
# 記憶領域を確保...]とさらっと記載されていました。うーん、例文
# くらい掲載してほしかった...あれ、例文あるな〜巻末に...
On Wed, 23 Feb 2005 00:01:49 +0900
神戸隆行 <kando@nerimadors.or.jp> wrote:
> tTest Mode1;/* define tTest type local object Mode1 */
> ptMode1 = &Mode1;/* get address of Mode1 */
> あるいは:
> ptMode1 = (tTest*)malloc(sizeof(tTest));
On Tue, 22 Feb 2005 15:43:46 +0000 (UTC)
kono@ie.u-ryukyu.ac.jp (Shinji KONO) wrote:
> 初期化でで解決するなら、
>
> tTest tTest0;
> tTest *ptMode1 = &tTest0;
>
> ですかね。1 line で
>
> tTest tTest0,*ptMode1 = &tTest0;
> 代わりのシンタックスとして、
> tTest& *ptMode1;
> (わけわからん)
> C++ っぽく、
> ptMode1 = tTest();
> new でもいいか、
> ptMode1 = tTest->new;
> GCC の拡張っぽく、
> ptMode1 = typed_malloc(tTest);
> (typeof (ptMode1)) p = ptMode1 ;
又、色々な方法のご教示ありがとうございます。
で、教えてもらった内容を元に、以下のような program を作成しました。
# 元々、以下の program 作成が目的で、先の program はエラーと
# なったことから、エラーの切り分けように作成したものです。
#
# 内容は、ユーザが宣言した構造体型ポインタに体して、別に設定している
# 構造体型ポインタのアドレスを設定するというものです。
#include <stdio.h>
typedef struct tSample {
int iDummy ;
int iDummy2 ;
} tSample ;
tSample gSystemArea , *pgSystem = &gSystemArea ;
int biSetPointer ( int *piTemp )
{
*piTemp = (int)pgSystem ;
return ( 1 ) ;
}
int main ( int srgc, char* argv[] )
{
tSample *pgUser ;
int biDone ;
pgUser = (tSample*)malloc(sizeof(tSample)) ;
pgUser->iDummy = 15 ;
pgSystem->iDummy = 30 ;
printf("pgUser->iDummy = %d\n" , pgUser->iDummy ) ;
printf("pgSystem->iDummy = %d\n" , pgSystem->iDummy ) ;
biDone = biSetPointer ( &pgUser ) ;
printf("pgUser->iDummy = %d\n" , pgUser->iDummy ) ;
printf("pgSystem->iDummy = %d\n" , pgSystem->iDummy ) ;
return(0) ;
}
これをコンパイルすると、
$ gcc dummy3.c
dummy3.c: 関数 `main' 内:
dummy3.c:34: 警告: 互換性のないポインタ型からの引数 1 個の `biSetPointer' を渡しますです
と、表示されます。一応コンパイルは出来るのですが、あまり気持のいい
ものでは有りません。
本来は以下の部分を、
biDone = biSetPointer ( &pgUser );
以下のようにすべきなのでしょうが、
biDone = biSetPointer ( (int * )&pgUser );
この部分は、変更せずに( &pgUser )のままで、関数側で
対処する方法はないものでしょうか? ご存じの方がいましたら
ご教授願います。
--
K.Moriyama
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