Hatena::ブログ(Diary)

さり海馬 このページをアンテナに追加 RSSフィード

2008-07-03

こんなコード書いちゃだめ

char array[] = "0123456789";

int i;
for( i=0; i< strlen( array ); i++ );
{
    printf( "%c\n", array[ i ] );
}

なんで1個しか、それもヌルしか表示されないんだろう?とか悩んじゃダメ

(すみません、sizeof()をstrlen()に直しました)

pipechairpipechair 2008/07/03 18:27 うは、一個しか表示されない理由はわかったけど(sizeof(array) = sizeof(char) 単体なので 1)
NULLしか表示されない理由がわからん。

いや、この回答さえ危ういかも。

pipechairpipechair 2008/07/03 19:09 いやいや、そもそもこのソース、printf をループしないじゃないか。
なるほど。array[10]を出力しているのか。そりゃNULLになるわ。

thalionthalion 2008/07/03 23:14 いらっさいませ。

内容に誤り(…というか、誤りというのならこのアーティクルそのものが誤りですが(笑))があったので修正しました。

>pipechair
二つ目のコメントが、まさに私が今日やらかしたアレです。何でそんなところにコロン打ってんだよ俺…って感じです。

2008-05-01

こんなコード書いちゃダメ、ゼッタイ

C++ってか、Cだ。

#define SIZE_OF_DST 3

main()
{
    char src[] = "0123456789";
    char dst[ SIZE_OF_DST ];
    char dmy[] = "abcdefghi";

    memcpy( (char*)dst, (const char*)src, sizeof( SIZE_OF_DST ) );
}

dst[ ]の後ろの領域dmy[ ]が破壊されるのはなぜだろう…って15分も悩んじゃ、もっとダメorz

くらはしくらはし 2008/05/01 15:28 終わらんよ…まだ終わらんよ<脂肪細胞一同

kajakaja 2008/05/01 22:43 ゴーゴー、明日お昼に行ってみよう。いつも会社脇のトプカに行っちゃうし、秋葉原に行った時でも、駅改札中のカレー屋ばかりだからな。ちょっと違う店いってみよう。

kajakaja 2008/05/03 00:04 ゴーゴー行って来たす。キャベツの千切りって結構いいな。

thalionthalion 2008/05/03 21:12 いらさいませ。

>くらはしさん
「引っ込んでろ、シャア!」赤い脂肪細胞が通常の三倍の速度で増えたら嫌です。

>kajaさん
美味しかったですか? うちは近所に55ないんで、チャレンジはしばらく先になりそうです。

2007-12-07

知らなかったよ:オーバーロードは継承できない

たまには仕事に関係あることを書いてみよう(笑)。

恥を覚悟で書く、先日ひどく悩んだこと。

  • ベースクラスBaseに既存のメソッドvoid method(int i)があります。
  • それを継承してDelivedクラスを作り、そこに既存のメソッドと同名だけどもシグネチャ(今回は引数の型)が違うメソッド void method( char a )を作ります。
  • Delived クラスのインスタンスを生成して、『Baseを継承してるから Baseクラスのmethod(int i) を使ってぇ…』とか考えます。
  • コンパイラが「int を char に変換して使ったら危ないかもよ?」みたいなことを言いやがります。どうやら method(char a)の方を呼んでるらしいです。

えええ…と思っていろいろ調べてみると、C++の言語仕様で「ベースと同じ名前*1のメソッドは継承した側のクラスから見えません」ってなってました。

…知らなかったよ。

詳細と回避方法はこちら→ http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html

*1:シグネチャが違ってても関係ねぇ