[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/01 04:04 / Filesize : 158 KB / Number-of Response : 656
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

なぜポインタで引っかかる人が多いのか



1 名前:デフォルトの名無しさん [2010/06/30(水) 10:22:47 ]
なぜポインタで引っかかる人が多いのか

引っかかる人は何に困惑しているのか


193 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 14:40:57 ]
>>183
良くない。
array[h][w]という表記ができない言語(例えばアセンブラ)ならそれでもいいが、
言語仕様で出来るのにやらないと、後から読んだ者を混乱させる。
理由があってわざとやらないのか、書いた奴が知らなかっただけなのか判断つかないからな。
それに、hとかwとかなら array[h*WID+w]でもarray[h][w]でも大差ないが、もっと複雑な式に
なった時に、[h][w]形式の方が断然読み易くなる。
ぶっちゃけ、二次元ポインタを使いこなせない奴の言い訳にしか見えない。

194 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 15:49:07 ]
どうでもいい。
個人的にはベタバッファにポインタアクセスのが分かりやすいし、使いやすい。
C++は知らんがCなら慣れの問題。

195 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 15:58:19 ]
array[i][j] と記述したくなるのは、ベクトルやマトリックス周辺だけかな。
数式をそのままに近い形式で記述したい という意図だけどね

196 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 16:09:18 ]
結果あわせるだけならどっちでもいいんだけれども
配列のアライメントや入れ替えがあるから、用途によるよね

197 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 16:42:13 ]
>>190
どう等価じゃないんですか?

198 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 16:56:35 ]
array[4][5]とarray[5][4]は違うと言っている。

199 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 18:54:32 ]
こういう書き方はどうか?(長文失礼)

・char , int は型である。
・Tが型ならば、T[N]は型である。(Tの配列と解釈する)
・Tが型ならば、$Tは型である。(Tへのポインタと解釈する)
・T,U1,U2,…,Umが型ならば、T(U1,U2,…,Um)という記号列は型である。(関数と解釈する)
・宣言方法は「T a;」とする。


具体例(カッコは適宜省略)  C言語での表記法
 ↓                 ↓
int a;          ( int a;という意味)
int[N] a;        ( int a[N];という意味)
(int[w])[h] a;      ( int a[h][w];という意味。wとhは逆になる)
$int a;         ( int* a; )
int(char) func;     ( int func(char); )

$($int) a;        ( int** a; )
($int)[N] a;      ( int* a[N]; )
$(int[N]) a;      ( int (*a)[N]; )

$(int(char)) f;     ( int (*f )(char); )
($int)(char) f;     ( int* f (char); )
int($char) f;      ( int f (char*); )
($(int(char)))[N] f;   ( int (*f [N])(char); )

($$(int(char)))[N] f;  ( int (**f [N])(char); )
$(($(int(char)))[N]) f; ( int (*(*f )[N])(char); )

200 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:03:33 ]
ご苦労さん


201 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:14:30 ]
>>193
記述の問題ならマクロ導入すりゃいいでしょう



202 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:17:35 ]
まあな。w

203 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:33:38 ]
ポインタに1足したら、2byteとか4byteとか進む?
ポインタってアドレスなんだろ?
そんなもん1進むに決まってるんじゃないのか?

204 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:41:18 ]
オブジェクト(要するに型)のサイズ分進む。
sizeof演算子で進む量を得ることが出来る。

205 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:58:50 ]
>>197
判ってて聞いてるんだろうけど
array[h * WID + w] と array[w][h] はポイントしているアドレスが違う
array[h * WID + w] と array[h][w] が同じ場所を指さないと
共同開発してる仲間に迷惑だろ?
そんなことも知らないからポインタスレに来てるんですねわかります

206 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 20:21:03 ]
前者は連続した領域にmallocすることが求められるが、
後者は離れた領域にmallocしても一向にかまわない。

207 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 20:22:13 ]
そろそろ>>163の見本お願いします

208 名前:163 mailto:sage [2010/07/06(火) 20:58:16 ]
>>207
まあ、あせるな
みんな、なかなかいい線いってるよ

もう少し検討が深まるのを待とう

209 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 21:32:28 ]
>>208
これはだめなの → >>177
C89ならw,dが変数でも通ったけど。

210 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 21:41:09 ]
>209
>208ではありませんが、コンパイラとコンパイルオプションを示してみてください
また、可能であればコンパイラのバージョンも示してみてください

211 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:00:20 ]
>>210
PC@Test> gcc --version
gcc.exe (GCC) 3.4.5 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
PC@Test> gcc -Wall -pedantic -std=c89 Test6.c
Test6.c:14: warning: ISO C90 forbids variable-size array `type_t'
Test6.c:14: error: variable-size type declared outside of any function
Test6.c:14: warning: ISO C90 forbids variable-size array `type_t'
Test6.c:14: error: variable-size type declared outside of any function

ごめん、今やったら通らんわ。



212 名前:221 mailto:sage [2010/07/06(火) 22:01:09 ]
昨日、下記のソースをいじってら通ったんでC89ならOKなんだと思ってた。
昨日の試行錯誤の過程で勘違いした模様。
#include <stdio.h>
#include <stdlib.h>
#define MODE (0)
#if MODE == 0
int w = 10;
int d = 20;
#elif MODE == 1
const int w = 10;
const int d = 20;
#elif MODE == 2
#define w (10)
#define d (20)
#endif
typedef char (*type_t)[w][d];
int main(void) {
int h = 30;
type_t array = (type_t)malloc(sizeof(char) * h * w * d);
printf("%d\n",((int)&array[0][0][1])-((int)array));
printf("%d\n",((int)&array[0][1][0])-((int)array));
printf("%d\n",((int)&array[1][0][0])-((int)array));
free(array);
return 0;
}

213 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:08:40 ]
てか何が出来たら「三次元的に扱え」たコトになるのよ?
条件が色々付いてるけど、根本的な要求が分からん

214 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:11:01 ]
下記のポンタ何を指すが書きなさい
15秒以内の回答できて小学1年レベルらしい
int (*a)[N];
int (*f )(char);
int (*f [N])(char);
int (**f [N])(char);
int (*(*f )[N])(char);

215 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:15:02 ]
>>214
日本人ではないな?
だからどう、ということもないが

216 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:51:32 ]
m行n列の二次元配列をメモリ上に表現する場合

1 サイズm*nの一次元配列として確保
2 サイズmのポインタの配列とサイズnの一次元配列m個

1の利点 ポインタの配列分メモリが必要無い
2の利点 列を削除追加できる

2は多段のポインタなので
普通の二次元配列として扱うと遅い
中継用のポインタ使う必要があるので可読性は低い

217 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:53:54 ]
2 はargvですね

218 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 22:57:59 ]
小学生すごいな、即答出来ても15秒で書けないな

219 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:01:51 ]
>>218
小学生でも朝鮮・中華の小学生だから

220 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:07:14 ]
>>214
上から順に

行列の行単位で動くポインタ
関数ポインタ
ポインタ配列
ポインタ配列
行列の行単位で動くポインタ

行列やポインタ配列の要素の型、つまりテンプレート引数に相当する部分は気にしない。
昔のJavaはそうだったというかむしろシンプルでわかりやすいとか言われて普及した。

221 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:28:34 ]
>>216
>2は多段のポインタなので
>普通の二次元配列として扱うと遅い

これマジ?
ケースバイケースだろうけど、乗算して加算して参照より、
参照してさらに参照のが速いのかと思ってた。



222 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:43:30 ]
>>221
F-22とスピットファイアくらい違う

223 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:00:13 ]
>>214
ポンタはわからねえな

224 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:08:27 ]
>>223
上から順に
 ポインタ
 ポインタ
 配列
 配列
 ポインタ
なのは分かるよね。
後は、ポインタだったらポインタの部分を削除して型を見て、
配列だったら配列の部部を削除して型を見る。
そうすると、
 配列のポインタ
 関数のポインタ
 関数のポインタの配列
 関数のポインタのポインタの配列
 関数のポインタの配列のポインタ
となる。

合ってる?

225 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:11:02 ]
>>180

int (*((*func(void))[]))(void)

これ鬼みたいだな
しかしプログラムを読むと大して難しい事をやっているわけではない
Cの宣言はどうしてこんなに難解なのだろうか

226 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:12:49 ]
>>222
どっちが速いのかすら分からん。

あー、もしかしてキャッシュに乗らない?
あんまりその世界で生きてないんで
どう動くのかサッパリ。

227 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:17:46 ]
>>225
アセンブリをやれば簡単に読めるようになる

228 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:33:24 ]
int (*((*func(void))[]))(void)
は保育園レベルでちゅよ
この程度すぐに解らんと保育園レベル未満の国語力ってことでちゅ

229 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:44:13 ]
>>225
リンク先は見てないけど、そんなに難解?
ちゃんと()付いてるし。

まず一見してfunc(void)な関数の宣言だろ。
*付いてるから返値はポインタ。
さらに[]なんで配列のポインタ。
次の*で、ポインタの配列のポインタ。
で、最後にint ()(void)なんで、つまりこの宣言は
そういう関数へのポインタの配列のポインタを返す、引数voidな関数funcの宣言。

長々書いて違ってたら、凄い恥ずかしいんだが、どないだろ?

230 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 01:14:43 ]
>>229
>長々書いて違ってたら、凄い恥ずかしいんだが、どないだろ?
どのように解析するか自信ないのか?
コンピラー(C言語)の構文解析ルールをよく知らないってこと?
コンピラーはfunc(void)が関数の宣言ってどうしてそう判断するん?
職業PGにとって構文解析って基礎中の基礎事項で学校で当然習っているじゃないの
それすら知らないのに職業PGやってるって人居ないよね
趣味PGなら自分が必要と感じたら勉強してみるか程度で良いけど

231 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 01:26:06 ]
>>221
キャッシュへのプリロードするのに間接参照だと予測不能。



232 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 01:41:39 ]
書き方を修正。「$T」じゃなくて「T$」に変えてみた。

・char , int は型である。
・Tが型ならば、T[N]は型である。(Tの配列と解釈する)
・Tが型ならば、T$は型である。(Tへのポインタと解釈する)
・T,U1,U2,…,Umが型ならば、T(U1,U2,…,Um)という記号列は型である。(関数と解釈する)
・宣言方法は「T a;」とする。

233 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 01:46:37 ]
以下、具体例。(長文失礼します)


具体例(カッコは適宜省略)  C言語での表記法
 ↓                ↓
int$ a;          ( int* a; )
(int$)$ a;        ( int** a; )
(int$)[N] a;       ( int* a[N]; )
(int[N])$ a;       ( int (*a)[N]; )

(int(char))$ f;     ( int (*f )(char); )
(int$)(char) f;     ( int* f (char); )
int(char$) f;      ( int f (char*); )
((int(char))$)[N] f;   ( int (*f [N])(char); )
((int(char))$$)[N] f;  ( int (**f [N])(char); )
(((int(char))$)[N])$ f; ( int (*(*f )[N])(char); )

$が入ってないものは>>199
全く同じになるので省略しました。

234 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 02:27:17 ]
>>232の定義に

・Tが型ならば、T[ ]は型である。

をつけ加えると、>>180
>int (*((*func(void))[]))(void)
これも232の形式で書けて

((((int(void))$)[ ])$)(void) func;

となります。
また、T[N]$ と書いたとき、これを(T[N])$と読むことは出来ても
T([N]$)と読むことは出来ないし、T$$とかT$[N]なども同様のことが
言えます。よって、ある程度カッコを省略できて、結局、
次のように表記できます。

((int(void))$[ ]$)(void) func;

235 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 04:45:01 ]
関数ポインタ関連の表記は参考サイトや本を読みながらじゃないと読めん
あれ何とかならんかったんか

236 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 04:58:29 ]
typedef すれば大抵解決

237 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 07:18:47 ]
>>230
煽りか本気か知らんが、職業PGに夢見すぎ

238 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 07:30:54 ]
関数ポインタが読みにくいという事はCでC++モドキのプログラムを
バリバリ書くのは不可能に近いって事ですね

それか無駄な時間を多量に要するか

239 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 11:32:30 ]
>>238
他の言語に比べて積極的な気持ちになりにくいかな?
ただ、昔読んだテキストエディタのソースでは、入力文字のアスキーコードを引数にして各入力処理関数に飛ぶように、関数ポインタの配列が使われていて感動した。
日本語処理をさせるのは難しそうだけど。

240 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 13:03:10 ]
perlよりマシだな

241 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 13:53:02 ]
エセクラスならgtk2が頑張ってなかったっけ?



242 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 14:11:48 ]
gtk++/gtkmm よりも gtk の方が出来が良いという

243 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 17:04:48 ]
>>229
あってますね
規則に従って変換したら、>>234になったw
int(void)*[]* (void) func

244 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 18:29:24 ]
>>235
>>232-234の書き方だと、日本語の語順そのままで
宣言できます。たとえば、

・(戻り値int,引数charの関数)へのポインタ

が欲しかったら、そのまま

(int(char))$ pfunc;

と書けます。>>180
>int (*((*func(void))[]))(void)
だったら、これを日本語読みすると

(((戻り値int,引数voidの関数)へのポインタ)の配列)へのポインタ)
を戻り値とする、引数voidの関数

となるので、この語順そのままに

(int(void))$[]$ (void) func;

と書けます。

245 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 21:45:29 ]
>>244
君は度々出て来るようだけど、結局主張は何?

246 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:04:51 ]
>>245
>>232-234の書き方なら、C言語よりも
ずっと読みやすい表記法で関数ポインタが表記できる、
ということです。

247 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:05:17 ]
>>245
型の表記は関数型言語スタイルがいいですね、ということです

248 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:08:02 ]
typedef の方が判りやすいよ

249 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:29:47 ]
>>248
typedefの方法は>>232-234と同じようなもんです。
あなたにとってtypedefが分かりやすいなら、
ほぼ同程度に232-234も分かりやすいことになります。
たとえば、C言語で

typedef int (*PFUNC)(char);

と書いておけば、もはや

PFUNC pfunc;

と書くだけで「(戻り値int,引数charの関数)へのポインタ」が
宣言できるようになりますが、このときの「PFUNC」という記号列は、
>>232-234で言うところの「(int(char))$」という記号列と
全く同じ役割をしています。つまり

Func ≡ (int(char))$

ということです(誤解を招きそうな式ですが)。
別の言い方をすれば、「PFUNC pfunc;」と同じ語順の宣言が
最初から可能なのが>>232-234ということです。

250 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:39:24 ]
ou....

× Func ≡ (int(char))$
○ PFUNC ≡ (int(char))$

251 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:41:50 ]
んなことは言われんでもわかっとる

    (int(char))$
よりも
    PFUNC
の方が判りやすいだろって話





252 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:52:58 ]
>>246
よく分かった。
新しい言語、文法を語りたいだけなら、引っ込んで黙れ。
そういうスレがあるし、そっち行け。

ポインタが分かりづらいのはCの文法が悪いから、とか
それなりのコト言うのかと思えば、ただのアホかよ。

253 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:55:49 ]
>>251
どうですかね。「PFUNC」と書いてしまうと、中身が
見えなくなって抽象的になってしまう弊害があります。
(int(char))$だったら、そのまま読めます。
しかも日本語の語順のまま読めます。
僕にとってはint(char)$ の方が読みやすいです。


ただし、PFUNCという記号列を日常的に
typedef int (*PFUNC)(char);
の意味で使っている人だったら、その人にとっては
PFUNCという記号列は全く抽象的では無いわけですから、
その人にとっては、PFUNCの方が読みやすいかもしれません。

254 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:59:14 ]
ひとつのプロジェクトに
独自のGC、newが複数混在してると
最高にわかり辛い

それぞれが読みやすいものでもな

255 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:02:06 ]
>>252
>ポインタが分かりづらいのはCの文法が悪いから、とか
>それなりのコト言うのかと思えば、ただのアホかよ。
え?それって同じことですよね?

「ポインタが分かりづらいのはCの文法が悪いからだ!」

という意見を煮詰めて行ったら、どのみち

「では、文法をこのように変えたらどうだろうか(例えば232-234のように)」

という意見にならざるを得ないでしょ?

256 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:09:36 ]
// それぞれが読みやすい
typedef int (*PFUNC)(char);
typedef PFUNC T[N];

// 混在すると分かり辛い
typedef int (*T[N])(char);

257 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:48:51 ]
混在してると分かりづらくなる文法が悪い?どっちが悪い?混在が悪い?文法が悪い?

258 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:58:37 ]
>>255
ならんよ。
だってその表記を見ても、Cのポインタが
理解できるようになりそうにないもの。

言語変えて済む話ならポインタのない言語を選べばいい。

259 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:17:00 ]
>>258
言ってることが矛盾してませんか?あなたにとって、

>ポインタが分かりづらいのはCの文法が悪いから、とか

↑この意見は"それなりの意見"なんですよね?(>>252にそう書いてあるし。)
でも、これは「Cの文法を改良すればポインタが分かるようになる」と
言っているのと同じことですよ。
一方であなたは

>言語変えて済む話ならポインタのない言語を選べばいい。

と言ってますから、結局あなたは
「Cの文法を改良すればポインタが分かるようになる」
という意見を全否定しているわけです。つまり、あなたは

>ポインタが分かりづらいのはCの文法が悪いから、とか

↑この意見を"それなりの意見"としつつも全否定しているわけです。

260 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:22:48 ]
●Cのポインタの文法は分かりづらい

●文法を変えたらもはやCではない

これは矛盾しないぞ


261 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:38:11 ]
>>260
これはひどいww

というのはさておき、
>●Cのポインタの文法は分かりづらい
これは単に文法の煩雑さを嘆いているだけであって、

>ポインタが分かりづらいのはCの文法が悪いから、とか

↑この意見とは全く別物ですよね。



262 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 06:58:00 ]
>>259
それなりの意見というのは、少なくとも
ポインタで引っかかる理由を言っている点においてそれなり。

それを解決する方法として、別の文法を考えるという
アプローチは全否定してるよ。
理由はCのポインタの理解に役立たないから。

そんなに矛盾してる?

263 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:16:57 ]
全否定はつられて言いすぎた。
なにがしかのモデル的に、理解の役に立つならいいんじゃないの?

「僕の考えた宣言の文法はスバラシイんです」
だから何なんだよ?

264 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:26:12 ]
Cを普通に勉強すれば済む話。
どっかの馬の骨の自分ルールはもうお腹一杯。しかも読みやすくなってないし。

265 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 07:48:01 ]
>>263
>「僕の考えた宣言の文法はスバラシイんです」
>だから何なんだよ?
それだけです。少なくとも>>235みたいな人の役には立ちますよね。
まあ、文法なんて結局は慣れの問題ですが。

>>264
あなたはCの文法に毒されすぎです。結局は慣れの問題に終始しますが、
それにしてもCの文法は「変」ですよ。誰でも一度はそう思うはずです。
熟練するほど忘れていく感覚ですが。

266 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:11:43 ]
>>264
>どっかの馬の骨の自分ルールはもうお腹一杯。
「自分ルール」と呼べるほど独りよがりな書き方では無いでしょう。
日本語読みの語順に忠実な表記を採用しているだけです。
ていうか、日本語読みの単なる省略記法です。

ポインタの宣言を日本語読みしたら、「intへのポインタ」
「(戻り値int,引数charの関数)へのポインタ」のように、
必ず「Tへのポインタ」という言い回しをするわけです。よって、
日本語読みに忠実なポインタ宣言の表記法は「T$ p;」とか
「T* p;」になります。

配列の宣言は必ず「Tの配列」という言い回しをしますから、
「T[N] a;」とか「T[ ] a;」という表記法が忠実です。
C#の場合は、配列の宣言はT[ ]ですよね(採用した理由は違うでしょうけど)。

関数の宣言は「戻り値T,引数U1,U2,…,Unの関数」と言いますから、
「T(U1,U2,…,Un) func;」という表記法が忠実です。
これがそんなに「自分ルール」ですかね?

267 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:16:40 ]
(長文ゴメンナサイ)

さて、どのような宣言の日本語読みも、構文解析のように分解すれば
「Tへのポインタ」「Tの配列」「戻り値T,引数U1,U2,…,Unの関数」に
分解できますから(ただし、ここでは構造体やクラスは考えないことにします)、
これらに忠実な表記を採用すれば、自動的に日本語読みと同じ語順の宣言になります。
この過程をよく見ると、単に日本語読みの省略記法を作っているだけの話ですよね。

>>229が良い例ですが、宣言されたポインタを理解するとき、あるいは相手に説明するとき、
やっぱり"日本語読み"に直して理解するわけです。それは「>>232-234の表記法に直して理解する」
と言っているのと同じことです。なぜなら、232-234は日本語読みの省略表記だからです。

僕は232-234を強要するつもりはありません。
でも、232-234を無闇に否定する人は、日本語を否定してるのと同じことですよ。

268 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 08:54:37 ]
>それだけです。
だから無意味だっつってんの

>少なくとも>>235みたいな人の役には立ちますよね。
立たない。
結局Cの宣言は読めないまま。

269 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:18:04 ]
日本語でしか通用しない新規ルールイラネ。世界中で通用するCをマスターした方がいい。終了。

270 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:27:21 ]
Cの文法はよくわからない。たぶん頭のよくない人が作ったんだろう。
よし頭のいい俺がもっといいルールを作ってやろう。

出来た!これで皆便利になるし、俺に感心するはずだ。

たぶんこういう思考回路なんだろうな・・・。
まさしく中二病ってやつだな。
見てるこっちが恥ずかしくなるよ。

271 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:30:46 ]
他人のオナニーを見たいわけがない罠



272 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 09:42:31 ]
俺は目に入るコード量が減るからtypedef使うけど、最初からC言語がその文法だったらと思うな
日本語読みというより、型の遠い順だね(Cもそうなんだけど見ため的に)

273 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 10:03:28 ]
>>232が得意げに自分ルールを披露したら賞賛されるどころか袋叩きにあっててワロタ

274 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 10:41:00 ]
Cの時代は終わってる

275 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:12:03 ]
すきにすりゃいいんだけどな
typedefしようがスマートポインタ使おうが

他人が使う事になれば苦労するって話

276 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:40:44 ]
確かにコーディング規約も命名規則もないところで、typedefは使ってほしくはないな

277 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 11:57:47 ]
個人的はtypedefを探すのにかかる時間次第かな。
2、3分くらいで見つかるようならtypedefして貰う方が読みやすい。

278 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 12:44:57 ]
> typedefを探す
意味が分かんないんだけどどういうこと?


279 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 13:05:09 ]
>>278
日本人ではないな?
だからどう、ということもないが

280 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 16:04:04 ]
>>278
ある定義名について、それをtypedefで宣言している文を探す、ということ

281 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 16:05:08 ]
>>279
日本人だよ

IDEなら言うまでもなく
非IDEでもタグファイルを作っておけば一瞬
最悪Grepしてもそんなに時間が掛かるものじゃない
探すという感覚が分からないんだよね
強いて言えば
coする程ではないが少し気になるものを
Webブラウザ上で眺めてるときかな?
と思ったりもしたけどそれはtypedefに限った話ではないしなぁ



282 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 21:17:44 ]
元の定義読んで意図理解する必要があるのは変わらないからな

メモリ確保がごっそり独自になってる事なんて
よくある事なんだけど

仕様読んで実装全部書き直して
移植したりとかめんどくせーから嫌いです

283 名前: ◆QZaw55cn4c mailto:sage [2010/07/08(木) 23:06:14 ]
>>265
Cの文法のどの点が変なのかわからない。多分毒されすぎたんですね。
さしつかえなければ教えてください。

284 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:33:48 ]
>>268
>だから無意味だっつってんの
まあ、ポインタ自体の話をしたい人には無意味でしょうね。

>結局Cの宣言は読めないまま。
ああ、そういう意味なら確かに。あなたは正しい。でも、>>235
>あれ何とかならんかったんか
この部分への1つの回答には なってますよね。

>>269
新規ルールではなく、既存のルールです。あなたは既に
このルールを使ってます。なぜなら、232-235は日本語読みの
単なる簡略表記に過ぎないからです。
あなたが日本語の語順で関数ポインタなり何なりを捉えたとき、
それは232-235を使っているのと全く同じことです。

あと、英語読みとも親和性は高いですよ。
日本語読みの語順を逆順にしたのが英語読みですから。

285 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:37:28 ]
アンカミス...
× 232-235
○ 232-234


>>270
賞賛される必要はありませんが、無闇に否定されるのは
おかしいです。なぜなら、232-234は日本語読みの単なる
簡略表記だからです。これを否定するのは>>229の説明方法を
否定するのと同じことですよ。

>>271
オナニーと言えるほど独りよがりな文法では無いでしょう。

intがN項の配列 a;
戻り値int,引数charの関数へのポインタ pfunc;

このような日本語のベタ書きと全く同じ表現をしているのが232-234です。
こういう表現形式を無闇に否定するのは、>>229の説明方法を否定するのと
同じことですよ。

286 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 23:50:46 ]
>>283
関数ポインタ周辺の宣言における表記の語順が、
自然言語の語順から かけ離れているところ。
日本語読みの語順と全然違うし、英語読みの語順とも全然違う。

287 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 01:36:19 ]
語順はどうでもいいけど
その定義の通るコンパイラ(またはプリコンパイラ)はもう実装出来てんの?


288 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 06:35:18 ]
反論かと思ったら同じこと繰り返すだけのキチガイか

289 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 07:19:55 ]
使用と宣言を一致させる、ってのはスルーなの?

290 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 10:31:20 ]
ポインタがわからなくてこのスレ開いたが
もう嫌だ何これorz

291 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 12:50:36 ]
このスレって何について話すスレなの?



292 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 13:44:36 ]
>>281
IDEの機能や、grepを使うのは充分「探す」だろう

293 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 16:05:01 ]
>>290
たとえば、どんな所がわからないの?
引っかかってるところを(それがどうして分からないのか)知る為に、色々教えてくれると思うが






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<158KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef