
ZDNetのポインタ解説記事で勘違い 196
ストーリー by nabeshin
あるAnonymous Coward 曰く、
訂正も行われたが、根本的には直っておらず、再レビューとなっているようだ。ZDNetに C/C++のポインタの機能 — 参照渡しのような処理というポインタの解説記事があるのだが、 中身がなかなか香ばしい。コメントにもあるように、記事の間違いを探すということで ポイントを理解させるというネタには使えるのだろうか。
とのこと。現在、本稿には技術的な誤りが存在するため、詳細をレビュー中です。 初めてご覧になる方は、コメント欄もあわせてお読み下さい。 また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。
騙されました。 (スコア:4, おもしろおかしい)
4/1の記事としては、最高の出来だと思います。
「つまらない」のが最大の問題 (スコア:4, すばらしい洞察)
前向きに有効活用する方法を考える (スコア:4, おもしろおかしい)
署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
3分? (スコア:2)
中途採用だと3秒で噴いてくれないと採用できないなぁ。
まぁ今年の新入社員で制限時間30秒だな。
# 甘やかしすぎかなぁ。10秒でいいかも。
Re:3分? (スコア:2, すばらしい洞察)
「まさかそんなアホなヘマをやっている筈がない、きっとこれは引っかけ問題だろう」
と深読みしすぎてかえって見落とす可能性があるので3分。
署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
Re:3分? (スコア:1)
そんなに褒めるなよ。テレるじゃないか。
# でも俺なんかまだまだだよ。俺の先生なんて紙テープ見ながら爆笑してたもの。
# いつかはあの境涯にまで登りつめたいものだ。
## ・・・そりゃ大変そうだな。紙テープ探すのが。
Re:前向きに有効活用する方法を考える (スコア:1)
「こんな奴でもチーフエンジニアなら俺でも……」という勢いでIBM大人気に、とか。
私が考える初心者向けのhello world!! (スコア:2, 興味深い)
一応書けるよ。
printf()は高機能かつ複雑なので
本当の初学者には向いてないと常々思ってたんだけど、
いい機会なのでさらしておこう。
このバージョンのほうが理解するのに必要な知識が少ないはず。
つれたつれた (スコア:3, おもしろおかしい)
,~~~~~~ 、
|\ ( 釣れたよ~・・・)
| \ `~~~v~~~´
し \
゙'゙":"''"''':'';;':,':;.:.,., ヽ○ノ
~~~~~|~~~~~~~ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ト>゚++
Re:つれたつれた (スコア:1, おもしろおかしい)
Re:つれたつれた (スコア:2, おもしろおかしい)
記事書いたライターはそのあたり解ってるのかな。
歴史は繰り返す (スコア:2, 興味深い)
あって、買ってはいけないプログラミング教本の第一位に輝いたとか、
新入社員プログラマにはこの本で勉強した経験があるかを最初に確認し、
誤った知識を矯正せよ。
などと言われたものですが。
本のタイトルと著者が思い出せない...
Re:歴史は繰り返す (スコア:5, 参考になる)
「実習C言語」と「応用C言語」も含めた三部作
Re:歴史は繰り返す (スコア:1, 参考になる)
事実誤認を指摘された時の反応も何ともはやアイタタタ...
フリーウェアをシェアウェアと誤認していたのを指摘された時 [goo.ne.jp]
ある曲の歌い手を誤認していたのを指摘された時 [goo.ne.jp]
間違いを指摘された後のやってはいけない対応方法の例としては、
大いに役に立ちます。
Re:歴史は繰り返す (スコア:1, おもしろおかしい)
関数の話(1) [tokyo.jp]
関数の話(2) [tokyo.jp]
関数の話(3) [tokyo.jp]
関数の話(4) [tokyo.jp]
関数の話(5) [tokyo.jp]
関数の話(6) [tokyo.jp]
関数の話(7) [tokyo.jp]
いまだによくわかってないのがスゴいですね。
Re:歴史は繰り返す (スコア:1, 参考になる)
#だって、大学の生協にうず高くつまれていたんだもん。
それで、何を言っているのか理解できなくてポインターが苦手になったな
論理的に考えてそんな事ないだろうって、でも本に書いてあるってことは正しいことなのだろう。 そうなると、俺の論理的思考に合わない言語仕様でプログラムを書くなんていやだ。 よって、ポインターは使わないことにしよう。
と考えたのを覚えている。結局、他の本(K&Rとかポインターの専門書)を読んで「だよなぁ」 と思ったのを覚えているな。 それでも最初の苦手意識は消えずにいまだに可能な限りポインターを使わないことにしている。
C++になってnewとかdeleteとか参照とかいろいろ使うけど、それでもポインターだけは鬼門だな。
Null 部門名 Exception (スコア:2, おもしろおかしい)
マジネタ (スコア:1)
天琉陳(Teruching)
see also (スコア:1)
Hiroki (REO) Kashiwazaki
これはひどい (スコア:1)
でも、自分がまったく理解していない言語の理解していない概念について、適当に聞きかじりと思い込みだけで記事を書くなよ、とは言いたい。
編集と著者の最低限の誠実さを疑う。
当該編集部と著者の名前は私の中ではブラックリスト入り確定です。
Re:これはひどい (スコア:1)
当人達は普通に正しいことと思っていて、何がおかしいかすら
分からなかった(推測ですが)というのがまた怖いですね。
さて、他の著書や記事では同様の問題はなかったのでしょうか?
#ターザンの意思なのでID
scanf (スコア:1, 興味深い)
さすがにこれは偏執狂ではないかと思うのだが・・・・・
ポインタの概念を教える授業でしっかり時間があれば
それは言及できるだろうが、このポインタの説明においては冗長だと思う。
その指摘を書いた人物は教師であると名乗っているが、
正確さを期そうとして、重要な事を述べる場面で注釈をいくつも付ける授業を行うのだろうか?
突っ込む側もポイントをしぼって突っ込んでもらいたい。
# だいたいからポインタの全てが2ページの記事で解説できるわけないじゃないか
# 概念の入り口の説明という認識にとどめるべき(まあそれも怪しかった訳だが・・)
# それに、俺たちが昔使ってた本にだって間違いは何かとあっただろ?
# 本や解説の間違いで行き詰まるのも勉強だと思うよ。
説明が下手なだけでは (スコア:1, 興味深い)
オーバフローというのは間違いで、次のようなコードで、どこを指しているかわからないポインタの 先のメモリを破壊するということを言いたかったのだと、想像します。
int *n;
scanf( "%d", n ); /* *nの値をキーボードなどから入力(Enterで終了) */
Re:scanf (スコア:1)
「scanf->バッファオーバーフロー」という脊髄反射だろうよ。
Re:scanf (スコア:1)
そこはほれ。話がポインタ操作間違いに関する話だけに、絞込みもままならないかと。
# よし。うまい事いえたぞ。
fjの教祖様
CとC++ (スコア:1)
単に
int n; // 整数型変数nを定義
int *p; // 整数ポインタ型変数pを定義
n = 5; // nに5を代入
p = &n; // pにnのポインタを代入
*p = 10; // pがポイントする変数に10を代入
見たいに書けば間違いも起こりにくくわかりやすい気がするんですけど。
本当にひどい記事だが (スコア:1)
Re:本当にひどい記事だが (スコア:2, おもしろおかしい)
その昔MS-DOSというメモリ保護のないOSがあってだな(以下3000コメントの懐古レス略)おそるべきことに「なんかnull pointer assignmentとか出てるけど動いてるんだからいいじゃん」という人たちが実在したんですよ。
Re:本当にひどい記事だが (スコア:2, 興味深い)
Re:本当にひどい記事だが (スコア:1)
Re:本当にひどい記事だが (スコア:2, すばらしい洞察)
int*と書けば、「整数のポインタ型」という型として認識出きるので混乱が少なくなります。typedefとか使ってpintとかにするとより良い感じですね。
TAなどで指導する時にも、そのように説明してるんですけど、如何せん教科書と記法が違うのが最大の問題です。
*の意味が宣言時と参照時?では違うということをきちんと説明してない本や人が多すぎorz
Re:本当にひどい記事だが (スコア:1)
そうじゃなくて、クラスかそうでないかで分けるのが普通では?
int *n = ...;
CObject* v = ...;
という具合に。Objective-Cとかでもそうかな。
理由としては、組み込み型の場合だと極端な例では
int a[] = {1, 2, 3}, *p = NULL, b = 3;
とかすることもままあるけど、クラスだと宣言は一個ずつことが多いことだと思います。
Best regards, でぃーすけ
オプティマイザの魔法? (スコア:1)
もしかして無意識にオプティマイザに助けられていて意識するのを忘れていたとか?
-- やさいはけんこうにいちば〜ん!
Re:オプティマイザの魔法? (スコア:3, 参考になる)
実はその前の1行: が死ぬほどやばい。
%eax は main() 関数に入ってきて以来、初期化されていない。
その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる。
これがヒープを壊しているのか、スタックを壊しているのかは判らないが(なんかヒープのどっかを指しているっぽい)、とにかく、どこかを壊しているのは間違いない。今回は小さなプログラムだったので、破綻が表出する前に終了しているのに過ぎない。
fjの教祖様
Re:オプティマイザの魔法? (スコア:1)
Best regards, でぃーすけ
Re:まぁ、驚いたのは (スコア:2, 興味深い)
自分でプログラミングすることなんか全く無いんでしょうね。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
ポインタがいまいち理解できない人には朗報だ。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
ソースを書いたら動かしてみるという発想が無いという時点で、普段プログラム書いてる人じゃないと思うんです。
まあIBMに内定している学生にとっては朗報じゃないでしょうか。
Re:まぁ、驚いたのは (スコア:3, 参考になる)
> これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。
別コメントにもあるけど、C言語には「反復子」「所有権」という概念はありません。アセンブラ的発想で考えれば理解は速いです。逆にアセンブラの経験がなければ難しいのかな?アセンブラの経験なくCを覚えるとどうなるか?は私には想像が付かないです。私がCを覚えたときにはCの吐き出したアセンブリを見て覚えましたが、当然ポインタで悩んだりつまずいたことはありませんでした。
> 配列の参照、スカラの参照
配列だって単にスカラー値がメモリ上に連続で並んでいるだけなのでその参照はスカラー値の場合と変らない、というのがCの概念。むしろC言語で「配列への参照」と言うと配列型へのポインタ(すなわちインクリメントするとメモリ上は配列の大きさ分飛ぶ)を指すと思います。例としては、
int (*)[3]
という型のこと。
Best regards, でぃーすけ
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
> - スカラ値への参照
> - 配列への参照
> - 反復子
すまん アセンブラだと、こういうコードかかない?
#つーか普通のレジスタの使い方だと思ったけど
#違うのかな?
> - 動的オブジェクトの所有権管理
これは わかんないけど
Re:まぁ、驚いたのは (スコア:2, すばらしい洞察)
自分の場合、C/C++ではポインタはメモリのどこかを指しているものという認識しかないですし、配列はメモリ上に連続してとられたスカラ値の集まりという認識しかないです(*1)。
だからポインタを持ってきて「スカラへの参照」「配列への参照」「反復子」として捉えることは無いですね。敢えて表現するならばポインタというものは一種類で「スカラ」「配列の先頭」「配列中のどこか」「ふめいなところ」を指していると捉えてる感覚でしょうか。
*1)なので、必ずしもメモリ上で連続していないようなコレクションの実装を指して「配列(もしくは Array)」と呼ぶのは違和感がある。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
>動的オブジェクトの所有権管理
CもC++もそんなことはやってくれないよ?
所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
んとなー?抽象度の高い方から理解しようとするから理解できないんだよ。
ポインタを理解するにはメモリイメージを持つこと。これに尽きる。
Re:まぁ、驚いたのは (スコア:1)
# さりげなく「スマートポインタ」と書かれているから。
これらを使うとnew/deleteの多くがコンストラクタ/デストラクタに置き換えられます。そしてコンストラクタは変数の宣言時、デストラクタは変数がスコープを抜けるときに自動的に実行されます。プログラマは適切なデータ型とスコープに注意することでメモリリークを防げます。
これらの長所・短所を理解した上で相手に対して「んんー?あんたホントにC++使い?」と発言されているのでしょうか?
Re:まぁ、驚いたのは (スコア:1)
感覚の問題かも知れんが、少なくとも俺はそうは思わない。
なぜならその例でいうdeleteで言えばnew/deleteとは無関係にポインタでアクセスできてしまうから。
「*(int*)0 = 0;」みたいないきなり「ぬるぽガッ」なコードだって書けちゃうし。
もしnew/deleteを所有権の管理とするなら所有する主体(主語)はオブジェクトではなくプロセスという解釈が必要になる。
でも、そうだとしてそれに意味があるのかどうかはかなり疑問。
>抽象度の高い課題には不要な理解で、生産性を下げます。
不要かどうかは別にして、それはそう。
だからそういう課題でパフォーマンス的にも細かい事言われないならC/C++はそもそも不向き。
Re:まぁ、驚いたのは (スコア:2, すばらしい洞察)
Javaが生まれたということはよく分かった。
優秀なエンジニア二人の手を止めてしまう訳か。
# お前らがポインタを知っている事はよく分かった。
# でも人に誤解しないように説明するスキルはそれと別だからな、ということ。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
知ってたら、この人がIBMのチーフエンジニアってわかるとこ教えて下さい。
#中の人?
Re:まぁ、驚いたのは (スコア:1, 参考になる)
ちなみに、中の人なら下のリンク先で検索すると出てきます。
http://www.ibm.com/contact/employees/us/ [ibm.com]
実在している? (スコア:1, 参考になる)
沖林 正紀
IBMソフトウェア事業部
データ・マネジメント事業
推進技術部のメンバー
1997年冬にJavaに遭遇してから以降、JSPのリファレンスサイトを開設したのがきっかけで、Javaでの開発に従事。その後DB2を担当する部門に常駐し、セミナー講師などを務める。雑誌やWebへの執筆、講演多数。
メールアドレスもあって(ここには書かないけど)、メールも出されている。
セミナー講師や講演を多数行っているという紹介が本当なら、実在の人物でしょう。もしそうなら、実際に話を聞いた人も多いのでは? IBMの名刺で働いているけれども、実際には外から派遣で来ている人だとか?
Re:まあまあ (スコア:2, 興味深い)
編集の人の能力がどうとかいうのはこの際どうでもいいんだけど、
それで終る話でもないんですよ。
笑い者になる/なっていると感じるかどうかは当人やこれらの話題を
見た人の印象しだいだし、この人の著書はこれからは避けようとか
思うのもそれぞれの自由。当人達が恥ずかしいと思ったら
記事を訂正した上で、これから精進すればいいだけの話。
(失った信用はなかなか取り戻せないと思うけど)
しかし、それとは別に、こういうのは見つけたらその都度
(というのもダルい話だが)徹底的にたたいて注意を喚起しとかないと、
気がつくと間違った知識がゴキブリみたいにはびこって大変なことに
なります。
そこらの野良サイトの素人の書きなぐり記事ならともかく、
れっきとした技術系サイトと一般的には思われるであろうZDNetに
載っているような記事だと、影響力が大きいでしょうし。
公共団体のサイトでが無断リンク禁止とか書かれていて
一般サイトでもそれにならってしまう件とか、どこかのサイトで
SSLについての誤った文章が書かれて、それがコピペされて
いろんなところで使われてしまったりとか、そんなところを
見つけて電凸しては指摘しているjbeef高木先生の苦労がしのばれます。
……なんて殊勝なことは考えたことなくて、実はおもしろおかしければ
どうでもいいんですけどね
#いや、それ、エイプリルフールで言ってみただけですから信用しないでね!
Re:まあまあ (スコア:1)
技術系記事のライターって不足しているんですかね? Webの記事なら、「紙面に穴が開いたから急遽代理で…」なんてこともないと思うのですが。
それとも、今更C言語の記事を引き受けてくれるライターがいないってことかな。