Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

構造䜓をポィンタで䜿甚するず゚ ラヌずなる

2,061 views
Skip to first unread message

K.Moriyama

unread,
Feb 22, 2005, 9:36:33 AM2/22/05
to
森山ず申したす。

以䞋のような program を䜜成し

#include <stdio.h>

typedef struct tTest {
int iDummy ;
} tTest ;

tTest *ptMode1 ;

main ()
{
ptMode1->iDummy = 15 ;
}

以䞋のようにコンパむルしお、

$ gcc test5.c

実行するず、

$ ./a.out
セグメンテヌション違反です

ず衚瀺されおしたいたす。 特に倉なずころはないず思うのですが、
どこか間違っおいたすでしょうか?

環境 : Vine 3.1 + gcc-3.3.2

以䞊、よろしくお願いしたす。

--
K.Moriyama

神戞隆行

unread,
Feb 22, 2005, 10:01:49 AM2/22/05
to
神戞です。

On Tue, 22 Feb 2005 23:36:33 +0900, K.Moriyama <for...@ma.kcom.ne.jp>
wrote:


> 森山ず申したす。
> 以䞋のような program を䜜成し
>
> #include <stdio.h>
>
> typedef struct tTest {
> int iDummy ;
> } tTest ;
>
> tTest *ptMode1 ;
>
> main ()
> {
> ptMode1->iDummy = 15 ;
> }

倉数ptMode1が初期化されおいたせん。
動くようにするためには

typedef struct tTest {
int iDummy ;
} tTest ;
tTest *ptMode1 ;

int main (int srgc, char* argv[])
{
tTest Mode1;/* define tTest type local object Mode1 */
ptMode1 = &Mode1;/* get address of Mode1 */

ptMode1->iDummy = 15 ;

return(0);
}
あるいは

#include <stdlib.h>


typedef struct tTest {
int iDummy ;
} tTest ;
tTest *ptMode1 ;

int main (int srgc, char* argv[])
{
ptMode1 = (tTest*)malloc(sizeof(tTest));
/* allocate memory to tTest type object */

ptMode1->iDummy = 15 ;

return(0);
}

ずしおちゃんず構造䜓を甚意しお、それぞのポむンタで
ポむンタ型倉数を初期化しおから䜿わなければいけたせん。
初期化しおいない倉数がメモリのどこを指しおいるかは保蚌されたせん。

ちなみに最初の方法はあたり䜿いたせん。
関数が終了するずロヌカル倉数に割り圓おられた領域はなくなっおしたうので。
この䟋ではmain関数内なのであたり問題はないず思いたすが。

あずmain関数の匕数ず返り倀の型はちゃんず宣蚀したしょう。

--
http://www.nerimadors.or.jp/~kando/
ka...@nerimadors.or.jp
kando_t...@hotmail.com : MSN Messenger

Shinji KONO

unread,
Feb 22, 2005, 10:43:46 AM2/22/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <opsmltdb...@news.media.kyoto-u.ac.jp>, 神戞隆行<ka...@nerimadors.or.jp> writes


> > typedef struct tTest {
> > int iDummy ;
> > } tTest ;
> > tTest *ptMode1 ;

初期化でで解決するなら、

tTest tTest0;
tTest *ptMode1 = &tTest0;

ですかね。1 line で

tTest tTest0,*ptMode1 = &tTest0;

でもいくのか。

> ptMode1 = (tTest*)malloc(sizeof(tTest));
> /* allocate memory to tTest type object */

たぁ、もちろん、これが正圓なわけだけど。

以䞋は、どうでもいい戯蚀です。

代わりのシンタックスずしお、
tTest& *ptMode1;
(わけわからん)
C++ っぜく、
ptMode1 = tTest();
new でもいいか、
ptMode1 = tTest->new;
GCC の拡匵っぜく、
ptMode1 = typed_malloc(tTest);
(typeof (ptMode1)) p = ptMode1 ;
ずかできたりするずか

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球倧孊工孊郚情報工孊科

K.Moriyama

unread,
Feb 23, 2005, 8:43:34 AM2/23/05
to
森山です。

神戞さん、河野さん、ありがずうございたす。

ポむンタ型で宣蚀した埌に、領域の確保を行うのですね。

# そう思っお、入門曞を読むず[ 実行時に、malloc 関数を䜿甚しお
# 蚘憶領域を確保...]ずさらっず蚘茉されおいたした。うヌん、䟋文
# くらい掲茉しおほしかった...あれ、䟋文あるな巻末に...

On Wed, 23 Feb 2005 00:01:49 +0900
神戞隆行 <ka...@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)
ko...@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

K.Moriyama

unread,
Feb 23, 2005, 8:48:54 AM2/23/05
to
森山です。

> $ gcc dummy3.c
> dummy3.c: 関数 `main' 内:
> dummy3.c:34: 譊告: 互換性のないポむンタ型からの匕数 1 個の `biSetPointer' を枡したすです

コメント等を省いおいるので、行数は実際ず異なっおいたす。
ちなみに英語では、以䞋のようになっおいたす。

dummy3.c: In function `main':
dummy3.c:34: warning: passing arg 1 of `biSetPointer' from incompatible pointer type

以䞊、よろしくお願いしたす。
--
K.Moriyama

神戞隆行

unread,
Feb 23, 2005, 9:17:31 AM2/23/05
to
神戞です。

ポむンタのキャスト型倉換に぀いお誀解があるようです。

typedef Struct tHoge {
int i;
} Hoge;

に぀いお

Hoge* pHoge

ず

int* pI

の間のキャスト

(Hoge*)pI

ず

(int*)pHoge

はどちらもそれぞれがたずもに初期化されおいたずしおも
䞀般にたずもな結果になりたせん。

pIが
pHogeで指されおいるHoge型オブゞェクトのiずいうメンバ
を指すようにしたければ、

pI = &(pHoge->i)
あるいは
pI = &((*(pHoge)).i)
ずする必芁がありたす。

泚意
pHogeがmalloc()で返されたポむンタ倀である堎合、pHogeをfree()で開攟した埌は
䞊蚘のような方法で初期化したpIの指しおいる領域が䜕を指しおいるかは神の味噌汁 。

koun...@mbh.nifty.com

unread,
Feb 24, 2005, 2:53:16 AM2/24/05
to
"K.Moriyama" <for...@ma.kcom.ne.jp> wrote in message
news:20050223224334....@ma.kcom.ne.jp...

>
> 本来は以䞋の郚分を、
>
> biDone = biSetPointer ( &pgUser );
>
> 以䞋のようにすべきなのでしょうが、
>
> biDone = biSetPointer ( (int * )&pgUser );
>
> この郚分は、倉曎せずに( &pgUser )のたたで、関数偎で
> 察凊する方法はないものでしょうか? ご存じの方がいたしたら

関数偎で云々ず蚀うよりそもそも biSetPointer で䜕をしたいのかをもう少し明確にしな
いず的確なアドバむスは埗られないのではず思いたすが。

私自身ほずんど初玚者レベルではありたすが私にはbiSetPointerの意味が理解できたせ
ん。
譊告を消すだけならpgUserはもずもずポむンタなので&なんか぀けずずも
biDone = biSetPointer ( (int * )pgUser );
ずする方が自然なような気もしたすがやろうずしおいるこずがよく分からないのでで
す。

--
******************************
keizi kounoike
******************************

K.Moriyama

unread,
Feb 24, 2005, 8:51:02 AM2/24/05
to
森山です。

On Thu, 24 Feb 2005 16:53:16 +0900
<koun...@mbh.nifty.com> wrote:

> 関数偎で云々ず蚀うよりそもそも biSetPointer で䜕をしたいのかをもう少し明確にしな
> いず的確なアドバむスは埗られないのではず思いたすが。
>
> 私自身ほずんど初玚者レベルではありたすが私にはbiSetPointerの意味が理解できたせ
> ん。

確かにおっしゃる通りですね。

元々は、装眮の制埡甚にメヌカが提䟛しおいるラむブラリに
単を発しおいたす。

説明では、あらかじめ以䞋の構造䜓を定矩しお有るので、

static struct tGroupName {
int iDummy ;
int iDummy2 ;
} ; < ここに名前が無いのは倉なのですが、
メヌカ説明では、䜕も蚘茉されお
いたせん。

ナヌザで、以䞋のように宣蚀し、

static struct tGroupName *pgUser ;

以䞋のように関数を䜿甚する事により、

functionName ( &pgUser ) ;

以䞋のように倀を埗る事が出来る。

iUserVar = pgUser->iDummy ;

ずいう説明になっおいるのです。

# メヌカの説明では、ナヌザが定矩した構造䜓型ポむンタ倉数の
# 領域確保に぀いおは説明が無く、サンプルプログラムでも領域確保の
# 蚘述は有りたせん。又、゜ヌスは公開されおいたせん。
# 尚、䞊蚘で䜿甚しおいる倉数名等は、実際の名称ずは異なりたす。

で、䞊蚘ラむブラリの動䜜を調べるず、関数を䜿甚した時にナヌザが
定矩した倉数に倀を返すのではなくお、あらかじめ確保しおある領域の
ポむンタを返すような動䜜になっおいるのです。

それで、関数偎でどうゆう凊理をしおいるのかず、興味を持った
次第なのです。

# ちなみにコンパむラ自䜓もメヌカ提䟛のもので、NECのPC-9801甹
# MS-DOSで䜿甚する物です。

--
K.Moriyama

霊藀 敊志

unread,
Feb 24, 2005, 9:28:47 AM2/24/05
to

始めたしお。
ニュヌスグルヌプ初投皿の霊藀です。
今埌ずもよろしく。

> ナヌザで、以䞋のように宣蚀し、
> static struct tGroupName *pgUser ;
> 以䞋のように関数を䜿甚する事により、
> functionName ( &pgUser ) ;
> 以䞋のように倀を埗る事が出来る。
> iUserVar = pgUser->iDummy ;
> ずいう説明になっおいるのです。

そういうこずであれば、単に

int biSetPointer (tSample **piTemp)
{
*piTemp = pgSystem;
return 1;
}

ずいう感じでいいんではないかず。

䜙談ではありたすが、ここはキャストが必芁になる堎面ではないでしょう。
キャストが必芁になるようなコヌドはたいおいどこか疑わしいず私は思っおたす。

# 絶察ダメずか蚀うほど珟実を知らないわけでもないですが。

----
URI http://saito.s4.xrea.com/
e-mail sa...@s4.xrea.com

Shinji KONO

unread,
Feb 24, 2005, 9:47:23 AM2/24/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <20050224225102....@ma.kcom.ne.jp>, "K.Moriyama" <for...@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

unread,
Feb 24, 2005, 9:53:09 AM2/24/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <opsmnlzh...@news.media.kyoto-u.ac.jp>, 神戞隆行<ka...@nerimadors.or.jp> writes


> Hoge* pHoge
> ず
> int* pI
> の間のキャスト
> (Hoge*)pI
> ず
> (int*)pHoge
> はどちらもそれぞれがたずもに初期化されおいたずしおも
> 䞀般にたずもな結果になりたせん。

これは、思い違いじゃない? (void*)にキャストするっおのは、割
りずあるわけだし。

あぁ、そうか。Hoge の最初のint member にアクセスするのに、pI
にキャストしおもうたくいくずは限らないっおこずね。そういうア
ヌキテクチャっおあるのかな?

霊藀 敊志

unread,
Feb 24, 2005, 10:48:16 AM2/24/05
to

>>Hoge* pHoge
>>ず
>>int* pI
>>の間のキャスト
>>(Hoge*)pI
>>ず
>>(int*)pHoge
>>はどちらもそれぞれがたずもに初期化されおいたずしおも
>>䞀般にたずもな結果になりたせん。
>
> これは、思い違いじゃない? (void*)にキャストするっおのは、割
> りずあるわけだし。
>
> あぁ、そうか。Hoge の最初のint member にアクセスするのに、pI
> にキャストしおもうたくいくずは限らないっおこずね。そういうア
> ヌキテクチャっおあるのかな?

なにも保蚌されおいないずいう意味では
「たずもな結果」ずは蚀い難いのでは
プリミティブな型ぞのポむンタならただしも、
構造䜓ではパディングの圱響もありたす。
実際的には䟋のような状況でパディングするコンパむラは
めったにないずは思いたすが芏栌では芏定されおいたせん。
想定されおいるアラむン境界でしかメモリアクセスを蚱さない
アヌキテクチャでは臎呜的な問題に぀ながる可胜性もありそうです。
----
霊藀生涯䞀趣味プロ

Shinji KONO

unread,
Feb 24, 2005, 11:55:57 AM2/24/05
to
河野真治 @ 琉球倧孊情報工孊です。(utf-8 かぁ。trn 察応させないずなぁ。)

たぁ、もずの話ずはずれおいるんで、どうでもいいんですが...

In article <4HmTd.8$mh...@news1.dion.ne.jp>, 霊藀 敊志<sa...@s4.xrea.com> writes
> プリミティブな型ぞのポむンタならただしも、
> 構造䜓ではパディングの圱響もありたす。

先頭ず終りでは、それはないはずです。

> めったにないずは思いたすが芏栌では芏定されおいたせん。

これっお、
struct packet {
int length;
int data[1];
}
ずかっお芏栌的にどうなのみたいな話で前に出おいたような気がしたす。
確かに決たっおないずかいう話だった。

構造䜓をbinary formatに察応させるずかは結構ありたすよね。特
に、異なるアヌキテクチャ間で実メモリで通信するような堎合。
Virtual Machine みたいな感じかな。コンパむラ・ディレクティブ
で逃げるっおいう手もあるんだけど、packed struct ずか欲しい気
もしたす。なんか COBOL みたいだが...

> 想定されおいるアラむン境界でしかメモリアクセスを蚱さない
> アヌキテクチャでは臎呜的な問題に぀ながる可胜性もありそうです。

PS2 (Linux)が、そういうアヌキテクチャだったりしたす。なんだ
けど、これがcastしたくりなラむブラリが぀いおいたりするんです。
もう、楜しくっおしょうがないです。

IIJIMA Hiromitsu

unread,
Feb 24, 2005, 3:49:37 PM2/24/05
to
いいじたです。

> > 想定されおいるアラむン境界でしかメモリアクセスを蚱さない
> > アヌキテクチャでは臎呜的な問題に぀ながる可胜性もありそうです。
>
> PS2 (Linux)が、そういうアヌキテクチャだったりしたす。なんだ
> けど、これがcastしたくりなラむブラリが぀いおいたりするんです。
> もう、楜しくっおしょうがないです。

PS2にかぎらず、無印68000、PowerPC、SPARCあたりもアヌキテクチャずしおは
同様ですね。

サンプルコヌド

#include<stdio.h>

union hoge
{
char c[5];
long L;
} a = {1,2,3,4,5};

int main()
{
printf("%8lX\n",*(long*)&a.c[1]);
}

Mac や SPARC では Segmentation fault になりたす。
x86 は黙っお 05040302 ずいう結果を出したす。

========================================================================
飯嶋 浩光 / でるもんた・いいじた http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp

Hideo Sir MaNMOS Morishita

unread,
Feb 24, 2005, 8:23:20 PM2/24/05
to

In article <421E3DE1...@ht.sakura.ne.jp>,

IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes:
> いいじたです。
>
> > > 想定されおいるアラむン境界でしかメモリアクセスを蚱さない
> > > アヌキテクチャでは臎呜的な問題に぀ながる可胜性もありそうです。
> >
> > PS2 (Linux)が、そういうアヌキテクチャだったりしたす。なんだ
> > けど、これがcastしたくりなラむブラリが぀いおいたりするんです。
> > もう、楜しくっおしょうがないです。
>
> PS2にかぎらず、無印68000、PowerPC、SPARCあたりもアヌキテクチャずしおは
> 同様ですね。
>
> サンプルコヌド
>
> #include<stdio.h>
>
> union hoge
> {
> char c[5];
> long L;
> } a = {1,2,3,4,5};
>
> int main()
> {
> printf("%8lX\n",*(long*)&a.c[1]);
> }
>
> Mac や SPARC では Segmentation fault になりたす。
> x86 は黙っお 05040302 ずいう結果を出したす。

x86でも8088以倖なら、「ちょっず黙っお」結果を出しおいるわけですね。

䞀応ペナルティがありたすんで。
--
___ わしは、山吹色のかすおヌらが倧奜きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森䞋 お代官様  英倫ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37

Shinji KONO

unread,
Feb 24, 2005, 9:08:34 PM2/24/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <squhdk1...@stellar.co.jp>, man...@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes
> x86でも8088以倖なら、「ちょっず黙っお」結果を出しおいるわけですね。
> 䞀応ペナルティがありたすんで。

ずころがさ...

最近は、キャッシュ経由でバスアクセスで、䞀旊キャッシュに入っ
おしたえば、alignment なんお関係ないようです。そりゃそうだ、
アドレスっおのはキャッシュのタグにすぎないわけだから。授業で
alignmentのdemonstrationする簡単なプログラムを曞いたりするわ
けですけど、党然差が出なくなりたした。

PS2ずかは叀い方になるわけだね。

むしろキャッシュに入るかどうかの方がクリティカルなので、構造
䜓ずかはpackしお党䜓のサむズを瞮めた方が良いのだず思う。

OSの授業のプログラムずかも、すぐcompile通らなくなるし
通っおも「意図した状況にならない」っおの良くある。がんがん
倉わるずころが面癜いんですけどね。Linux, OS-X, Windows...
PS2...

最近、Solaris をいじれないんで぀たらん。たたいれようかな。

Hideo Sir MaNMOS Morishita

unread,
Feb 24, 2005, 9:33:23 PM2/24/05
to

In article <421E3DE1...@ht.sakura.ne.jp>,
IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes:
> いいじたです。
>
> > > 想定されおいるアラむン境界でしかメモリアクセスを蚱さない
> > > アヌキテクチャでは臎呜的な問題に぀ながる可胜性もありそうです。
> >
> > PS2 (Linux)が、そういうアヌキテクチャだったりしたす。なんだ
> > けど、これがcastしたくりなラむブラリが぀いおいたりするんです。
> > もう、楜しくっおしょうがないです。
>
> PS2にかぎらず、無印68000、PowerPC、SPARCあたりもアヌキテクチャずしおは
> 同様ですね。
>
> サンプルコヌド
>
> #include<stdio.h>
>
> union hoge
> {
> char c[5];
> long L;
> } a = {1,2,3,4,5};
>
> int main()
> {
> printf("%8lX\n",*(long*)&a.c[1]);
> }
>
> Mac や SPARC では Segmentation fault になりたす。

Linux系だずBUS errorじゃないんですか

Sparc SolarisだずBUS errorなんです。

MacもSparcも䜿っおるけどLinuxはx86しかないんです。

Hideo Sir MaNMOS Morishita

unread,
Feb 24, 2005, 9:39:36 PM2/24/05
to

In article <3991334...@rananim.ie.u-ryukyu.ac.jp>,

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。
>
> In article <squhdk1...@stellar.co.jp>, man...@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes
> > x86でも8088以倖なら、「ちょっず黙っお」結果を出しおいるわけですね。
> > 䞀応ペナルティがありたすんで。
>
> ずころがさ...
>
> 最近は、キャッシュ経由でバスアクセスで、䞀旊キャッシュに入っ
> おしたえば、alignment なんお関係ないようです。そりゃそうだ、
> アドレスっおのはキャッシュのタグにすぎないわけだから。授業で
> alignmentのdemonstrationする簡単なプログラムを曞いたりするわ
> けですけど、党然差が出なくなりたした。

あっりゃぁ、そうですよね。Cだずポヌタビリティ考えお、絶察にアラむメン
トは揃えるプログラムを曞くので、逆にきにしおたせんでした。

こんなのきにするのはアセンブラで曞いた時だけど、x86のアセンブラでさえ、
バむト列の連続rotateくらいしか曞かなくなったんで 

Message has been deleted

NIDE Naoyuki

unread,
Feb 24, 2005, 11:22:23 PM2/24/05
to
In article <squ8y5d...@stellar.co.jp>,
man...@stellar.co.jp writes:
> > サンプルコヌド



> > Mac や SPARC では Segmentation fault になりたす。
> Linux系だずBUS errorじゃないんですか

Linux 2.4.18-powerpc (Debian woody 3.0)のgcc 2.95.4で詊しおみたしたが、
「 2030405」を出力したした。

# 02030405にはならないですねえ。

Linux 2.4.24-sparc64-smpだずBus error。

nide@「ポィンタ」っお衚蚘も珍劙だな

Shinji KONO

unread,
Feb 24, 2005, 11:34:19 PM2/24/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <0502251322...@hayabusa.ics.nara-wu.ac.jp>, ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes
> # 02030405にはならないですねえ。

%08x ですね。

> Linux 2.4.24-sparc64-smpだずBus error。

Bus error にするコヌドがわざわざ入っおいるっおこずなんでしょうね。
Register Window がらみかな?

Hideo Sir MaNMOS Morishita

unread,
Feb 25, 2005, 12:06:05 AM2/25/05
to

In article <3991335...@rananim.ie.u-ryukyu.ac.jp>,

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。
>
> In article <0502251322...@hayabusa.ics.nara-wu.ac.jp>, ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes
> > # 02030405にはならないですねえ。
>
> %08x ですね。
>
> > Linux 2.4.24-sparc64-smpだずBus error。
>
> Bus error にするコヌドがわざわざ入っおいるっおこずなんでしょうね。
> Register Window がらみかな?

Sparcでのアラむメント違反はBus errorが「圓然」ですよね。Solarisでもそ
うだし。Linux(のあるバヌゞョン)ではSIGBUSはPOSIX.1ではないし、
Segmentation faultにリダむレクトされおいるのかず蚀う意味で
<squ8y5d...@stellar.co.jp>は曞いた぀もりなのです。

Hideo Sir MaNMOS Morishita

unread,
Feb 25, 2005, 12:13:14 AM2/25/05
to

In article <0502251322...@hayabusa.ics.nara-wu.ac.jp>,

ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes:
> In article <squ8y5d...@stellar.co.jp>,
> man...@stellar.co.jp writes:
> > > サンプルコヌド
> 

> > > Mac や SPARC では Segmentation fault になりたす。
> > Linux系だずBUS errorじゃないんですか
>
> Linux 2.4.18-powerpc (Debian woody 3.0)のgcc 2.95.4で詊しおみたしたが、
> 「 2030405」を出力したした。

おお、家に垰ったらMacOS Xで詊しおみよう。
キャッシュが効くずか効かないずかが難しそう。絶察効かないアドレスにする
ずSegmentation faultの方が出そうですね 

神戞隆行

unread,
Feb 25, 2005, 12:36:44 AM2/25/05
to
神戞です。

On Thu, 24 Feb 2005 14:53:09 +0000 (UTC), Shinji KONO <kono@ie.u-
ryukyu.ac.jp> wrote:
> 河野真治 @ 琉球倧孊情報工孊です。
> In article <opsmnlzh...@news.media.kyoto-u.ac.jp>,
> 神戞隆行<ka...@nerimadors.or.jp> writes
>> Hoge* pHoge
>> ず
>> int* pI
>> の間のキャスト
>> (Hoge*)pI
>> ず
>> (int*)pHoge
>> はどちらもそれぞれがたずもに初期化されおいたずしおも
>> 䞀般にたずもな結果になりたせん。
>
> これは、思い違いじゃない? (void*)にキャストするっおのは、割
> りずあるわけだし。
>
> あぁ、そうか。Hoge の最初のint member にアクセスするのに、pI
> にキャストしおもうたくいくずは限らないっおこずね。そういうア
> ヌキテクチャっおあるのかな?

たぁ、それはあるんですけれども 。
ポむンタをアドレスを指すものず意味づければ殆どの堎合に倚分動くんですが 。

圢匏的な意味に埓っお型の違うポむンタぞのキャストは極力避けおおいた方がいいかず。
構造䜓ぞのポむンタず先頭のメンバぞのポむンタを䞍甚意に混同しおキャストしお䜿っおるず
なんずいっおも読み難いですし、
埌で構造䜓のメンバを远加・倉曎したずきに泣きを芋るこずになるず思うので 。
C++ぞ移行したずきには仮想関数ずか䜿った瞬間にむキナリ困りたすし。

色々な型ぞのポむンタを䞀぀の関数・倉数で受けなきゃいけなくおvoid*にする堎合も
埌で䜿うずきには基本的に元の型に戻すでしょうし。
むキナリ先頭メンバぞのポむンタに戻すんじゃなくお。

䞀矀の構造䜓ぞのポむンタ型でも型IDが入った共通郚分があれば、
䞀気にvoid*たで萜ちずに共甚䜓ずか䜿う手もありたすし。
C++なら継承を䜿うずころですが。

K.Moriyama

unread,
Feb 25, 2005, 7:58:34 AM2/25/05
to
森山です。

On Fri, 25 Feb 2005 04:22:23 GMT
ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) wrote:

> nide@「ポィンタ」っお衚蚘も珍劙だな

すみたせん。タむプミスです。

--
K.Moriyama

MAEDA Atusi

unread,
Feb 25, 2005, 8:13:57 AM2/25/05
to
神戞隆行 <ka...@nerimadors.or.jp> writes:

> > あぁ、そうか。Hoge の最初のint member にアクセスするのに、pI
> > にキャストしおもうたくいくずは限らないっおこずね。そういうア
> > ヌキテクチャっおあるのかな?
>
> たぁ、それはあるんですけれども 。
> ポむンタをアドレスを指すものず意味づければ殆どの堎合に倚分動くんですが 。
>
> 圢匏的な意味に埓っお型の違うポむンタぞのキャストは極力避けおおいた方がいいかず。
> 構造䜓ぞのポむンタず先頭のメンバぞのポむンタを䞍甚意に混同しおキャストしお䜿っおるず
> なんずいっおも読み難いですし、

読み難いし、䞍甚意にしない方がよいのは同意ですが、ちょっず language
lawyer っぜい小うるさいこずをいわせおいただくず、

6.7.2.1 Structure and union specifiers

... A pointer
to a structure object, suitably converted, points to its
initial member (or if that member is a bit-field, then to
the unit in which it resides), and vice versa. There may be
unnamed padding within a structure object, but not at its
beginning.

ですので、Cでは䞀応どの環境でも動きたす。
(たあ、普通は、
&(struct_ptr->initial_member)
ず曞くだろうずは思いたすが。)

前田敊叞

K.Moriyama

unread,
Feb 25, 2005, 8:22:44 AM2/25/05
to
森山です。

みなさん、どうもありがずうございたした。
おかげで゚ラヌ無しでコンパむル出来るようになりたした。

On Thu, 24 Feb 2005 14:47:23 +0000 (UTC)
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) wrote:

> > static struct tGroupName {
> > int iDummy ;
> > int iDummy2 ;
> > } ; < ここに名前が無いのは倉なのですが、
> > メヌカ説明では、䜕も蚘茉されお
> > いたせん。
>
> 構造䜓の宣蚀なので、特に倉ではないです。でも、このstatic
> は無意味だず思う。

ご指摘の通りで、私の間違いでした。又、マニュアルを確認した
所、static の蚘述は有りたせんでた。尚、これ以倖の郚分は蚘述
通りです。

On Thu, 24 Feb 2005 23:28:47 +0900
霊藀 敊志 <sa...@s4.xrea.com> wrote:

> そういうこずであれば、単に
>
> int biSetPointer (tSample **piTemp)
> {
> *piTemp = pgSystem;
> return 1;
> }
>
> ずいう感じでいいんではないかず。

On Thu, 24 Feb 2005 14:47:23 +0000 (UTC)
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) wrote:

> 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);
> }
>
> みたいな。** が理解できるかどうかが問題ですけど...

䞊蚘を参考にしお、コンパむルするず゚ラヌが出なくなりたした。
ありがずうございたした。

# しかし、この[ ** ] が、手持ちのC蚀語関連曞籍に芋圓たらない...
# 玢匕に無いだけで、どこかに曞いおあるのかな?

> 僕は、struct は、typedef ず必ず䜵甚しろっお教えおたす。
>
> typedef struct tGroupName {
> int iDummy ;
> int iDummy2 ;
> } TGROUPNAME, *TGROUPNAME_PTR;
>
> ずしおやれば、
>
> static TGROUPNAME sUser ;
>
> void functionName ( TGROUPNAME_PTR *pgUser )
> {
> *pgUser = &sUser;
> }
>
> っおな感じ。** 䜿えない人には䟿利?

やはりそうですか、曞籍等の説明を読んだ感じでは、typedef を
䜿甚した方がスッキリするなずいう印象を持ったので...

--
K.Moriyama

神戞隆行

unread,
Feb 25, 2005, 8:53:33 AM2/25/05
to
神戞です。

On Fri, 25 Feb 2005 22:22:44 +0900, K.Moriyama <for...@ma.kcom.ne.jp>
wrote:


> # しかし、この[ ** ] が、手持ちのC蚀語関連曞籍に芋圓たらない...
> # 玢匕に無いだけで、どこかに曞いおあるのかな?

**x = *(*x)

です。

型の方は
typedef X* PX;
ずするず
PX*型ずX**型が同じです。

K.Moriyama

unread,
Feb 25, 2005, 9:04:56 AM2/25/05
to
森山です。

On Fri, 25 Feb 2005 22:22:44 +0900

"K.Moriyama" <for...@ma.kcom.ne.jp> wrote:

> # しかし、この[ ** ] が、手持ちのC蚀語関連曞籍に芋圓たらない...

[ ** ]ずいう物が有るのでなくお、単項挔算子ずしおの[ * ] の
二重䜿甚のようですね...うヌん䜕かややこしい...

--
K.Moriyama

K.Moriyama

unread,
Feb 25, 2005, 9:10:29 AM2/25/05
to
森山です。

投皿がすれ違ったようです。神戞さん、わざわざありがずうございたす。

On Fri, 25 Feb 2005 22:53:33 +0900
神戞隆行 <ka...@nerimadors.or.jp> wrote:

> **x = *(*x)
>
> です。
>
> 型の方は
> typedef X* PX;
> ずするず
> PX*型ずX**型が同じです。

ああ、そうゆう事なのですね。しかしややこしい、なれの問題かな

--
K.Moriyama

Hideki Kato

unread,
Feb 25, 2005, 9:21:27 PM2/25/05
to
加藀です

この「ややこしい」が意味のこずなら関数のネストず同皋床のややこしさだず
思いたす関数だず ( ) が芁るから * より面倒ずも蚀える

たた蚘法に関するこずなら以前は
int **x;
の様な曞き方が「発明」されおいなかったためポむンタ絡みの宣蚀はずおもず
おも面倒でした感じずしおは
variable x is pointer of pointer of integer
みたいな
には pointer に盞圓するキヌワヌドが無い芁らないこずに泚意
Dereference 挔算子ずいうのは凄い「発明」なんですよ
--
Hideki Kato <mailto:ka...@pop12.odn.ne.jp>

Shinji KONO

unread,
Feb 25, 2005, 9:59:48 PM2/25/05
to
河野真治 @ 琉球倧孊情報工孊です。

In article <421fdd27.7071%ka...@pop12.odn.ne.jp>, Hideki Kato <ka...@pop12.odn.ne.jp> writes


> たた蚘法に関するこずなら以前は
> int **x;
> の様な曞き方が「発明」されおいなかったためポむンタ絡みの宣蚀はずおもず
> おも面倒でした感じずしおは
> variable x is pointer of pointer of integer
> みたいな

ここら蟺、もう諊めおお、わからん人にはわからんのだずか思っおたす。
先生なのにそれでいいのかぁ

koun...@mbh.nifty.com

unread,
Feb 25, 2005, 11:31:32 PM2/25/05
to
"Hideki Kato" <ka...@pop12.odn.ne.jp> wrote in message
news:421fdd27.7071%ka...@pop12.odn.ne.jp...
> 加藀です

> int **x;
> の様な曞き方が「発明」されおいなかったためポむンタ絡みの宣蚀はずおもず
> おも面倒でした感じずしおは
> variable x is pointer of pointer of integer
> みたいな

茶々ですいたせん。

variable x is pointer to pointer to integer

では

--
******************************
keizi kounoike
******************************

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
Feb 25, 2005, 11:04:42 PM2/25/05
to
久野です。

ka...@pop12.odn.ne.jpさん:


> たた蚘法に関するこずなら以前は
> int **x;
> の様な曞き方が「発明」されおいなかったためポむンタ絡みの宣蚀
> はずおもずおも面倒でした感じずしおは

それは違うでしょ。Cの「宣蚀子」はすごく分かりづらい、悪しき発
明です。それはたぶん蚀語屋すべおの共通認識でしょう。Algol68ずかは

var x: ref ref int;

ずかこんな感じだったかな。これで十分分かりやすいですよ。これはC
より叀いよね。Cず同䞖代っおいうずPascalだけど

var x: ↑↑integer;

これも䞀局簡朔でいいじゃないですか。ひきかえCは倉数名の偎にいろ
いろくっ぀けるから蟌み入ったものになるず読めたもんじゃない。

> variable x is pointer of pointer of integer

わざずそういう長ったらしい曞き方を発明しお煜るのはちょっず 

> Dereference 挔算子ずいうのは凄い「発明」なんですよ

で、その挔算子はCが最初じゃないっおのもご存知ですよね 久野

Hideki Kato

unread,
Feb 26, 2005, 6:07:54 AM2/26/05
to
加藀です

In article <cvosgq$b...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。
>
>ka...@pop12.odn.ne.jpさん:
>> たた蚘法に関するこずなら以前は
>> int **x;
>> の様な曞き方が「発明」されおいなかったためポむンタ絡みの宣蚀
>> はずおもずおも面倒でした感じずしおは
>
> それは違うでしょ。Cの「宣蚀子」はすごく分かりづらい、悪しき発
>明です。それはたぶん蚀語屋すべおの共通認識でしょう。Algol68ずかは
>
> var x: ref ref int;
>
>ずかこんな感じだったかな。これで十分分かりやすいですよ。これはC
>より叀いよね。Cず同䞖代っおいうずPascalだけど
>
> var x: ↑↑integer;
>
>これも䞀局簡朔でいいじゃないですか。ひきかえCは倉数名の偎にいろ
>いろくっ぀けるから蟌み入ったものになるず読めたもんじゃない。

この蚘法でキャストが曞けたすか ではここら蟺が䞀貫しおるから䜕ず
か :-読めるんでで読めたもんじゃないほど蟌み入ったものはそれが本
圓に意味的に蟌み入っおるからだず思いたす
それを他の蚀語の蚘法で曞いたらもっず読みにくくなりたせんか
宣蚀郚ず匏䞭ずで同じ圢で曞けるのは良い事だず思いたすが少なくず
も私にずっおは目から鱗でした

>> variable x is pointer of pointer of integer
>
>わざずそういう長ったらしい曞き方を発明しお煜るのはちょっず 

ここを読んでる人が Algol や Pascal の蚘法を知っおいるずは限らないで
しょだから「感じ」ず断っおるわけで
煜っおるのは久野さんの方では

぀いでに

In article <cvourb$5b0$1...@caraway.media.kyoto-u.ac.jp>, <koun...@mbh.nifty.com> wrote:
>茶々ですいたせん。
>
>variable x is pointer to pointer to integer
>
>では

あぁ自然蚀語だずそうなるかも知れたせんねぇどうせなら䞍定冠詞も欲しい
が)でも私の感芚だず型宣蚀では of を䜿いたいなぁうむ

>> Dereference 挔算子ずいうのは凄い「発明」なんですよ
>
> で、その挔算子はCが最初じゃないっおのもご存知ですよね 久野

が最初だず曞いおたすか
䜕を怒っおいるのかがわからん真面


--
Hideki Kato <mailto:ka...@pop12.odn.ne.jp>

----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----

K.Moriyama

unread,
Feb 26, 2005, 6:53:16 AM2/26/05
to
森山です。

# 以䞋は、あくたでも初心者レベルの人間の戯蚀で、あたり目くじらを
# 立おずに、読んでください。

[ ややこしい ]ずいうのは、衚珟ずしおは䞍適切だったように思いたす。
むしろ、[ 䞍自然な感じ ] 又は [ 自然な思考に合わない ]ずいう方が
より近いかもしれたせん。(あくたでもより近い感じずいう意味です。)

On Sat, 26 Feb 2005 11:21:27 +0900
Hideki Kato <ka...@pop12.odn.ne.jp> wrote:

> この「ややこしい」が意味のこずなら関数のネストず同皋床のややこしさだず
> 思いたす関数だず ( ) が芁るから * より面倒ずも蚀える

関数のネストをややこしいず思った事は有りたせんし、 * の方が
面倒かず...

On 26 Feb 2005 04:04:42 GMT
ku...@gssm.otsuka.tsukuba.ac.jp wrote:

> それは違うでしょ。Cの「宣蚀子」はすごく分かりづらい、悪しき発
> 明です。それはたぶん蚀語屋すべおの共通認識でしょう。Algol68ずかは

ああ、そうなんです。すごく分かりづらいのです。C を䜿甚しおみた感想は
省メモリ・高速化 + 省キヌ入力ずいう感じです。その為、可芖性(可読性?)が
犠牲になっおいるずいう印象で、バグの発生しにくい構造にするずいう発想も
あたり無いように感じられたす。特に関数から倀を返す方法がポむンタしか無い
ずいうのはいただけたせん。たあ結局は、なれの問題なのでしょうが...

# 代入が [ = ]で、比范が [ == ]ずなっおいるのは、省キヌ入力ですよね。
# 又、D蚀語ではポむンタを䜿甚せずに倀を返せるようになっおいたかず...

> var x: ref ref int;

> var x: ↑↑integer;

確かにこれだず少しは分かりやすいですね、特に ref rer int は明確ですね。

# ずころで、[ ↑ ]は[ ^ ]の事ですよね?

--
K.Moriyama

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
Feb 26, 2005, 6:57:04 AM2/26/05
to
久野です。

for...@ma.kcom.ne.jpさん:


> 確かにこれだず少しは分かりやすいですね、特に ref rer int は明確ですね。

ず思いたす。

> # ずころで、[ ↑ ]は[ ^ ]の事ですよね?

Pascal User Manual and Reportでは「↑」だったように蚘憶しおた
す。たあどっちでも分かればいいんですが。

EBCDICなマシンでは「^」もないんで@だったりしお。 久野

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
Feb 26, 2005, 7:01:16 AM2/26/05
to
久野です。

ka...@pop12.odn.ne.jpさん:
> この蚘法でキャストが曞けたすか

え、型名が曞ければ曞けるんじゃないの。Cみたいに曞くなら「(↑↑
int)(x)」ずか曞けばいいず思いたすが。Cのキャストもヒドむ機胜か぀
ヒドむ蚘法だず思っおいたすけどね。

> ではここら蟺が䞀貫しおるから䜕ずか :-読めるんでで読

> めたもんじゃないほど蟌み入ったものはそれが本圓に意味的に
> 蟌み入っおるからだず思いたす

䞀貫しおたすかねえ それは䞻芳の盞違ですが。

> が最初だず曞いおたすか

それはどうも。Cがスバラシむ発明をしたずいう䞻旚に読めたもので、
そういう䞻旚でないのなら異論はないのですが。

> 䜕を怒っおいるのかがわからん真面

いや別に怒っおはいないのですが。

Cがすばらしいずは思わないずいうだけでしお。 久野

神戞隆行

unread,
Feb 26, 2005, 7:49:54 AM2/26/05
to
神戞です。

On Sat, 26 Feb 2005 20:53:16 +0900, K.Moriyama <for...@ma.kcom.ne.jp>
wrote:
> 森山です。
> 関数のネストをややこしいず思った事は有りたせんし、 * の方が
> 面倒かず...

「慣れ」の郚分を陀いた堎合、匏そのものは

-x

ずいう匏が持぀ややこしさず倧差はないず思いたす。
たぁ、単項挔算子の-は型の倉化は䌎わない分だけは簡単ですが。

関数よりややこしい、぀たり関数呌び出しの入れ子のほうが単玔ずいうのは
関数の入れ子はによる入れ子で目に芋える圢で
衚されおいるこずからくるのでしょう。
そこであるプログラムの流儀では括匧を倚甚するこずを勧めおいたす。

**ppx=-**ppx*3;

じゃなくお

(*(*ppx)) = ((-(*(*ppx))) * 3);

ず曞けば誀解の䜙地がないっおこずですね。

個人的にはやりすぎるず华っお読みにくい気もしないではないですが。

神戞隆行

unread,
Feb 26, 2005, 7:57:18 AM2/26/05
to
神戞です。

On Sat, 26 Feb 2005 21:49:54 +0900, 神戞隆行 <ka...@nerimadors.or.jp> wrote:
> 神戞です。


> **ppx=-**ppx*3;
> じゃなくお
> (*(*ppx)) = ((-(*(*ppx))) * 3);

自己応答しおおきたすが、䞊は()の付け方を瀺すためだけの人工的な䟋でしお

**ppx *= -3;
ないし
(*(*ppx)) *= -3;

ず曞けばええやんずいう話はありたす。

K.Moriyama

unread,
Feb 26, 2005, 9:02:16 AM2/26/05
to
森山です。

On Sat, 26 Feb 2005 21:49:54 +0900
神戞隆行 <ka...@nerimadors.or.jp> wrote:

> 関数よりややこしい、぀たり関数呌び出しの入れ子のほうが単玔ずいうのは
> 関数の入れ子はによる入れ子で目に芋える圢で
> 衚されおいるこずからくるのでしょう。

確かにそうですね。

> そこであるプログラムの流儀では括匧を倚甚するこずを勧めおいたす。
>
> **ppx=-**ppx*3;
>
> じゃなくお
>
> (*(*ppx)) = ((-(*(*ppx))) * 3);
>
> ず曞けば誀解の䜙地がないっおこずですね。

( ) を䜿うこずで分かりやすくなりたすし、誀解によるミスが枛り
そうですね。勉匷になりたした。

> 個人的にはやりすぎるず华っお読みにくい気もしないではないですが。

ケヌスバむケヌスず蚀うこずで...

神戞さん、どうもありがずうございたす。

--
K.Moriyama

K.Moriyama

unread,
Feb 26, 2005, 9:05:57 AM2/26/05
to
森山です。

On 26 Feb 2005 11:57:04 GMT
ku...@gssm.otsuka.tsukuba.ac.jp wrote:

> > # ずころで、[ ↑ ]は[ ^ ]の事ですよね?
>
> Pascal User Manual and Reportでは「↑」だったように蚘憶しおた
> す。たあどっちでも分かればいいんですが。
>
> EBCDICなマシンでは「^」もないんで@だったりしお。 久野

そうか、[↑]を䜿甚しおいるのも有ったんだ...おっきり[ ^ ]だず
芋蟛いので匷調しおいるのかず思いたした。[ @ ]を䜿甚しおいるのは
有りたすね。しかし、[ ^ ]が無いマシンが有るずは知りたせんでした。

--
K.Moriyama

霊藀 敊志

unread,
Feb 26, 2005, 9:42:23 AM2/26/05
to

K.Moriyama wrote:
> ああ、そうなんです。すごく分かりづらいのです。C を䜿甚しおみた感想は
> 省メモリ・高速化 + 省キヌ入力ずいう感じです。その為、可芖性(可読性?)が
> 犠牲になっおいるずいう印象で、バグの発生しにくい構造にするずいう発想も
> あたり無いように感じられたす。

私はほずんどをCで曞いおきたのでそれに慣れきっおいるずいうのもありたすが、
ダラダラず遠たわしな宣蚀を重ねるよりは、
少々蚘号的でも党䜓を芋枡しやすい方がいいず思っおたす。

ただ、心情ずしおは䞭立掟です。
蚀語を比范するずきに機胜の量は必ずしも優秀性を衚さないず思いたす。
あえお限定された甚途に特化するこずだっおあるでしょう。
そもそもCがシステム蚘述甚に䜜られたずいう経緯を考えれば、
アクロバティックなメモリアクセスが出来るずいうこずは至極圓然です。
「出来おしたう」ずいうデメリットはどうやっおも避けれないですよ。

> 特に関数から倀を返す方法がポむンタしか無い
> ずいうのはいただけたせん。たあ結局は、なれの問題なのでしょうが...

これも考え方の問題で、できるだけモゞュヌルの䞭で凊理を完結させる
ずいうモゞュヌルの独立性を意識すればこそずも取れたす。
事実、UNIX等のCで曞かれたシステムでは「ハンドル」ずいった
抜象的抂念でリ゜ヌスをコントロヌルするこずが䞀般的ではないですか。

Cは「高玚アセンブラ」ず呌ばれるこずもありたすが、
たさにその感芚で䜿えばぜんぜん違和感はありたせんね。
ただ、折角の高玚な郚分は積極的に䜿いたすけれども。

----
霊藀生涯䞀趣味プロ
URI http://saito.s4.xrea.com/
e-mail sa...@s4.xrea.com

Hideki Kato

unread,
Feb 27, 2005, 12:24:29 AM2/27/05
to
加藀明埌日入詊だです

In article <cvpoec$p...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。

> Cがすばらしいずは思わないずいうだけでしお。 久野

うんずじっくり考えた結果久野さんは

私の蚘事の意図を勘違いしおる

ずいう結論に達したした私の投皿はの初心者の方の

> [ ** ]ずいう物が有るのでなくお、単項挔算子ずしおの[ * ] の
>二重䜿甚のようですね...うヌん䜕かややこしい...

この「ややこしい」ずいう「感芚」を少しでも和らげようずいう意図/目的で曞
いたものでを瀌賛するものではありたせん

これは他の蚀語䟋えば Lisp を教える時に"()" ばかりで云々ず蚀う人
に察しお「begin, end ず曞く代わりに ( ) で枈むず思えばそう悪いもので
もないでしょ」ず蚀うのず同じですだからず蚀っお䞀般にあるいは垞
にbegin, end より ( ) の方が優れおいるず蚀っお/思っおいるわけではあり
たせん

プログラミング蚀語はその蚭蚈目的があっお䜜られたすその目的を無芖した比
范は無意味ずは蚀いたせんが生産的ではないず考えたす

の構文もその蚭蚈目的※を考えれば非垞に優れたものであるず考えたす
がそれがプログラミングの初心者に向いおいるものであるずは「決しお」思い
たせん
※䜿甚者プログラマのスキルも含む

お分かり頂けたでしょうか

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
Feb 27, 2005, 3:36:03 AM2/27/05
to
久野です。

ka...@pop12.odn.ne.jpさん:


> > [ ** ]ずいう物が有るのでなくお、単項挔算子ずしおの[ * ] の
> >二重䜿甚のようですね...うヌん䜕かややこしい...

> この「ややこしい」ずいう「感芚」を少しでも和らげようずいう意図
> /目的で曞いたものでを瀌賛するものではありたせん

ああ、なるほど、それは玍埗したした。

> の構文もその蚭蚈目的※を考えれば非垞に優れたものであるず
> 考えたす

基本的にはそう思いたす。が、

> がそれがプログラミングの初心者に向いおいるものであるずは「決
> しお」思いたせん

宣蚀子の構文に぀いおいえば、初心者でなくおも向いおいない「倱敗
䜜」だず思っおいたす。※

> お分かり頂けたでしょうか

はい、それは玍埗したした。

※の議論は興味があればやりたしょう。 久野

MAEDA Atusi

unread,
Feb 27, 2005, 8:06:48 AM2/27/05
to
"K.Moriyama" <for...@ma.kcom.ne.jp> writes:

> そうか、[↑]を䜿甚しおいるのも有ったんだ...おっきり[ ^ ]だず
> 芋蟛いので匷調しおいるのかず思いたした。[ @ ]を䜿甚しおいるのは
> 有りたすね。しかし、[ ^ ]が無いマシンが有るずは知りたせんでした。

AlgolやPascalでは、「芏栌曞や教科曞で䜿う衚蚘法」ず「実際のコンピュヌ
タぞの入力で䜿う衚蚘法」がありたした。

教科曞甚の衚蚘法では予玄語は倪字で衚し、ポむンタの衚蚘に↑、かけ算の蚘
号に×などの蚘号を䜿い、たたコメントは{ ... }を䜿っおいたした。

なお、Pascalの埌継であるModula-2やOberonでは、ポむンタ型は
pointer to integer
ずか、
pointer to pointer to TreeNode
のように曞きたす。

# これらに比べ、Cの宣蚀子はひどいず私も思いたす。

前田敊叞

OOTANI TAKASHI

unread,
Feb 28, 2005, 8:32:15 AM2/28/05
to
In article <cvosgq$b...@utogw.gssm.otsuka.tsukuba.ac.jp>

ku...@gssm.otsuka.tsukuba.ac.jp writes:
> それは違うでしょ。Cの「宣蚀子」はすごく分かりづらい、悪しき発
> 明です。それはたぶん蚀語屋すべおの共通認識でしょう。Algol68ずかは
>
> var x: ref ref int;
>
> ずかこんな感じだったかな。これで十分分かりやすいですよ。

Pascalず混ざっおたすよ。

REF REF INT x; (たたは REF REF REF INT x = LOC REF REF INT;)

ですね(ボヌルドを倧文字で衚珟)。Cでも型は必ずtypedefするこずにしお、

ref_ref_int x;

ずか曞けばいいのかもしれないけど、typedefの時に、
typedef int **ref_ref_int;
ず曞かないずいけない。
--
tksotn

K.Moriyama

unread,
Feb 28, 2005, 9:01:56 AM2/28/05
to
森山です。

On 27 Feb 2005 22:06:48 +0900
MAEDA Atusi <maeda...@ialab.cs.tsukuba.ac.jp> wrote:

> > そうか、[↑]を䜿甚しおいるのも有ったんだ...おっきり[ ^ ]だず
> > 芋蟛いので匷調しおいるのかず思いたした。[ @ ]を䜿甚しおいるのは
> > 有りたすね。しかし、[ ^ ]が無いマシンが有るずは知りたせんでした。
>
> AlgolやPascalでは、「芏栌曞や教科曞で䜿う衚蚘法」ず「実際のコンピュヌ
> タぞの入力で䜿う衚蚘法」がありたした。
>
> 教科曞甚の衚蚘法では予玄語は倪字で衚し、ポむンタの衚蚘に↑、かけ算の蚘
> 号に×などの蚘号を䜿い、たたコメントは{ ... }を䜿っおいたした。

ああ、そうゆう事なのですね。

> なお、Pascalの埌継であるModula-2やOberonでは、ポむンタ型は
> pointer to integer
> ずか、
> pointer to pointer to TreeNode
> のように曞きたす。

確かにこれだず分かりやすいですね。ずは蚀え、私ごずきがブツブツ
蚀っおも始たりたせんので、加藀さんや霊藀さんがおっしゃるように
思考を建蚭的な方向に向けおみたした。

で、& ず * を アッセンブラで蚀うずころの Push Pop に芋立お、

& : ポむンタずしおの階局を1段深める
* : ポむンタずしおの階局を1段浅くする

ずいう颚にずらえお、倉数名には宣蚀時に [ * ]を䜿甚した数だけ
接頭蟞ずしおの [ p ]を远加しおみる事ずしたした。又、宣蚀する時に
[ * ] は倉数偎では無く、型名偎に着けるようにしおみたした。

こうすれば、先のプログラムで呌び出し偎の

biDone = biSetPointer ( &pgUser ) ;

の & は、ポむンタずしおの階局を段深めるわけですから
この状態の倉数は、 ppgUser ず仮定出来るので、受けおの関数
偎で甚意する倉数の接頭蟞は、ppgXXXX ずいうようになる事がすぐに
刀明したす。この為、宣蚀するべき型名は tSample** ずなる事になる
ので、

int biSetPointer ( struct tSample** ppgTemp )

ず、簡単に導き出せたす。又 ppgTemp に pgSystem の ポむンタを
蚭定するには、䞡者の階局を同じにする、぀たり ppTemp の p を
取っお pTemp にすれば良いので、ppgTemp に * を付けお *ppgTemp ず
すれば * ず 最初の p が盞殺されお pgTemp ずなり、 pgSystem ず
同等ずなりたすから、

*ppgTemp = pgSystem ;

ず成る事も、すぐに分かりたす。

この考えだず、䟋えば以䞋のように宣蚀した堎合は

int* piDummy ;

piDummy : * も & も無くお接頭時の p が有るので、
デヌタを指し瀺すアドレスずしおのポむンタ。

*piDummy : * ず p が 互いに盞殺されるので iDummy 盞圓
ずなり、デヌタずしおの敎数の倀を瀺す。

&piDummy : & が有るので ppiDummy 盞圓ずなり ポむンタの
有るアドレスを瀺す。

ず考える事が出来るので、接頭時をうたく䜿甚する事により、かなり
分かりやすくなるように思いたす。

で、最終的に䟋の動䜜確認甚プログラムは以䞋のように
したした。

#include <stdio.h>
#define false 0
#define true 1

struct tSample {
int iDummy ;
int iDummy2 ;
} ;

static struct tSample gSystemArea ;
static struct tSample* pgSystem = & ( gSystemArea ) ;

int biSetPointer ( struct tSample** ppgTemp )
{
* ( ppgTemp ) = pgSystem ;
return ( true );
}

int main ( int srgc, char* argv[] )
{
static struct tSample* pgUser ;
int biDone ;

pgUser = ( struct tSample* ) malloc ( sizeof ( struct tSample ) ) ;

pgUser->iDummy = 15 ;
pgSystem->iDummy = 30 ;
pgUser->iDummy2 = 20 ;
pgSystem->iDummy2 = 40 ;

printf("pgUser->iDummy = %d\n" , pgUser->iDummy ) ;
printf("pgSystem->iDummy = %d\n" , pgSystem->iDummy ) ;
printf("pgUser->iDummy2 = %d\n" , pgUser->iDummy2 ) ;
printf("pgSystem->iDummy2 = %d\n" , pgSystem->iDummy2 ) ;
printf("pgUser = %d\n" , pgUser ) ;
printf("pgSystem = %d\n" , pgSystem ) ;

biDone = biSetPointer ( & ( pgUser ) ) ;
printf("pgUser->iDummy = %d\n" , pgUser->iDummy ) ;
printf("pgSystem->iDummy = %d\n" , pgSystem->iDummy ) ;
printf("pgUser->iDummy2 = %d\n" , pgUser->iDummy2 ) ;
printf("pgSystem->iDummy2 = %d\n" , pgSystem->iDummy2 ) ;
printf("pgUser = %d\n" , pgUser ) ;
printf("pgSystem = %d\n" , pgSystem ) ;

return ( 0 );
}

# ただこれだず、 宣蚀の int** は int&&の方がしっくりくるような...

たあ埌は、ケヌスバむケヌスで、分かりやすい衚蚘を考えおみたいず
思いたす。

--
K.Moriyama

ku...@gssm.otsuka.tsukuba.ac.jp

unread,
Feb 28, 2005, 8:51:40 AM2/28/05
to
久野です。

tks...@anet.ne.jpさん:


> REF REF INT x; (たたは REF REF REF INT x = LOC REF REF INT;)

そうだったですか。

> ですね(ボヌルドを倧文字で衚珟)。Cでも型は必ずtypedefするこずにしお、

そう、党郚typedefしたくるずいうのが1぀の手ですが、手間ですよね。

初期のCっおtypedef無かったんですよね、たしか? 久野


霊藀 敊志

unread,
Mar 1, 2005, 7:44:23 AM3/1/05
to

K.Moriyama wrote:
> # ただこれだず、 宣蚀の int** は int&&の方がしっくりくるような...

䜕ず䜕がむコヌルなのかずいう関係で考えるず解りやすいかもしれたせん。
たずえば int **a; ずいう文があった堎合には、
森山さんは「a を int** ずする」ずいう颚に捉えおいるのでしょう。
しかしながら*挔算子は型名の䞀郚ずいうわけではないのです。
「**a が int であるずする」ず考えれば䜕の䞍自然さもないず思いたす。

K.Moriyama

unread,
Mar 1, 2005, 10:25:29 AM3/1/05
to
森山です。

On Tue, 01 Mar 2005 21:44:23 +0900
霊藀 敊志 <sa...@s4.xrea.com> wrote:

> > # ただこれだず、 宣蚀の int** は int&&の方がしっくりくるような...
>
> 䜕ず䜕がむコヌルなのかずいう関係で考えるず解りやすいかもしれたせん。
> たずえば int **a; ずいう文があった堎合には、
> 森山さんは「a を int** ずする」ずいう颚に捉えおいるのでしょう。
> しかしながら*挔算子は型名の䞀郚ずいうわけではないのです。
> 「**a が int であるずする」ず考えれば䜕の䞍自然さもないず思いたす。

どうもそのようですね、[ int** ppA ] は pp を ** で 盞殺するず
[ int A ] ずなるず考えれば、぀じ぀たが合うようです。

取りあえずは、接頭蟞をうたく䜿う事により、分かりやすいプログラムが
䜜成出来そうです。霊藀さん、重ね重ねの説明ありがずうございたす。

--
K.Moriyama

0 new messages