<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C/C++</title><link>http://blogs.wankuma.com/izmktr/category/1784.aspx</link><description>C/C++</description><managingEditor>出水 洸太郎</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>出水 洸太郎</dc:creator><title>[C++/CLI]Stringの糸口</title><link>http://blogs.wankuma.com/izmktr/archive/2008/11/28/162261.aspx</link><pubDate>Fri, 28 Nov 2008 06:11:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/11/28/162261.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/162261.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/11/28/162261.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/162261.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/162261.aspx</trackback:ping><description>&lt;P&gt;意外に、C++/CLIで検索する方がいるようなので、&lt;BR&gt;C++/CLIを始めたときに混乱していたネタを投下します。&lt;/P&gt;
&lt;P&gt;C++/CLIを始めてから、よくわからない印象を持ったのが文字列の扱いです。&lt;BR&gt;ハンドル型なのに実体のような動きをする存在で、不思議に見えました&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;System::String ^str1 = gcnew System::String("abc");
System::String ^tmpstr = str1;

Console::WriteLine(str1);
Console::WriteLine(tmpstr);

str1 = gcnew System::String(str1 + "def");

Console::WriteLine(str1);
Console::WriteLine(tmpstr);
&lt;/PRE&gt;
&lt;P&gt;初期化はchar*と同じようにできますが、なぜか足し算もできます。&lt;BR&gt;演算子オーバーロードでうまくやっているんでしょうと理解していました。&lt;/P&gt;
&lt;P&gt;そして、いちばん混乱したのがこれ。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;System::String ^str1 ="abc";
System::String ^tmpstr = str1;

Console::WriteLine(str1);
Console::WriteLine(tmpstr);

str1 += "def";

Console::WriteLine(str1);
Console::WriteLine(tmpstr);
&lt;/PRE&gt;
&lt;P&gt;もし、char *のように振舞うのであれば、&lt;BR&gt;2回目のWriteLineでは両方とも"abcdef"が出力されないといけませんが、&lt;BR&gt;実際には、str1は"abcdef"、tmpstrは"abc"と出力されます。&lt;/P&gt;
&lt;P&gt;しかし、ハンドル型なので実体を持ち運んでいるわけではないはず。&lt;BR&gt;Stringだけ特殊な扱いを受けている？？&lt;/P&gt;
&lt;P&gt;どうにも解せないときに出会ったキーワードが以下の2つ。&lt;BR&gt;・ボックス化&lt;BR&gt;・String不変&lt;/P&gt;
&lt;P&gt;キーワードにしたがって、上のソースを書きなおしてみます。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;System::String ^str1 = gcnew System::String("abc");
System::String ^tmpstr = str1;

Console::WriteLine(str1);
Console::WriteLine(tmpstr);

str1 = gcnew System::String(str1 + "def");

Console::WriteLine(str1);
Console::WriteLine(tmpstr);
&lt;/PRE&gt;
&lt;P&gt;まず最初の変数初期化ですが、ボックス化によりgcnewが付与されます。&lt;BR&gt;ですから、char*のように先頭ポインタだけを指しているわけではありません。&lt;/P&gt;
&lt;P&gt;そして、+=演算子。&lt;BR&gt;これがもう一つのString不変です。&lt;BR&gt;Stringの内容が変化を受ける場合、そのつど新しい領域が確保されます。&lt;BR&gt;ですから、後半のstr1とtmpstrでは指しているアドレスが違うわけでです。&lt;/P&gt;
&lt;P&gt;String不変の観点でSystem::Stringを調べてみると、&lt;BR&gt;ハンドル型の変数を書き換えられない状況では、ReadOnlyになっています。&lt;BR&gt;（たとえば、[]演算子）&lt;/P&gt;
&lt;P&gt;StringはUnicodeを格納するクラスなので、char*やstd::stringとは違い、&lt;BR&gt;固定文字列を持ち運ぶもの、と理解しておくといいでしょう。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/162261.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]進数いろいろ</title><link>http://blogs.wankuma.com/izmktr/archive/2008/11/07/160739.aspx</link><pubDate>Fri, 07 Nov 2008 22:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/11/07/160739.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/160739.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/11/07/160739.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/160739.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/160739.aspx</trackback:ping><description>&lt;P&gt;C言語には10進数以外にもいろんな進数表現で数値を指定できます。&lt;BR&gt;それを今回まとめてみました。&lt;PRE class=Cpp name="code"&gt;
#include &amp;lt;iostream&amp;gt;
using namespace std;

int main(){
  // 10進数指定
  cout &amp;lt;&amp;lt; 123 &amp;lt;&amp;lt; endl;

  // 8進数指定
  cout &amp;lt;&amp;lt; 0123 &amp;lt;&amp;lt; endl;

  // 16進数指定
  cout &amp;lt;&amp;lt; 0x123 &amp;lt;&amp;lt; endl;

  // 謎進数指定
  cout &amp;lt;&amp;lt; 0e123 &amp;lt;&amp;lt; endl;

  return 0;
}
&lt;/PRE&gt;
&lt;P&gt;本当にいろんな指定ができますね～。&lt;/P&gt;
&lt;P&gt;#片桐さんに感謝しつつ、混乱させるエントリーを書いてみる&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/160739.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]隠された引数</title><link>http://blogs.wankuma.com/izmktr/archive/2008/10/01/157947.aspx</link><pubDate>Wed, 01 Oct 2008 22:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/10/01/157947.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/157947.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/10/01/157947.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/157947.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/157947.aspx</trackback:ping><description>&lt;P&gt;C言語のmainで、こんなコードを見ました。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;int _tmain(int argc){
  ...
  return 0;
}
&lt;/PRE&gt;
&lt;P&gt;Visual C++ 2008なので_tmainになっています。&lt;BR&gt;0個や2個のパターンは多いですが、1個は初めてです。&lt;/P&gt;
&lt;P&gt;調子に乗って3個目をつけてみます。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;int _tmain(int argc, _TCHAR* argv[], _TCHAR *env[]){
  for (int i = 0;env[i] != NULL; i++){
    printf(L"%s\n", env[i]);
  }
  return 0;
}
&lt;/PRE&gt;
&lt;P&gt;なんと、環境変数が入ってます！&lt;/P&gt;
&lt;P&gt;4個目はどうだ&amp;#8230;コンパイル通っちゃった！！&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;int _tmain(int argc, _TCHAR* argv[], _TCHAR *env[], int *value){
  // これは実行できる、ただ意味のありそうな値は入ってない
  printf("%x\n", value);
  // こっちはアウト、アドレスじゃないみたい
  printf("%d\n", *value);
  return 0;
}
&lt;/PRE&gt;
&lt;P&gt;でも、実行すると無効なアドレスを指しているということで落ちてしまいます。&lt;BR&gt;たまたまメモリにある、適当な値を拾ってきているだけっぽいですね。&lt;/P&gt;
&lt;P&gt;ちなみに、こんなmainでもコンパイルエラーにはなりません。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;void * _tmain(){
  return 0;
}
&lt;/PRE&gt;
&lt;P&gt;要は、mainと名がついていれば細かいことは気にしない性格みたいですよ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/157947.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C]おもいこみぽろぽろ</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/19/156948.aspx</link><pubDate>Fri, 19 Sep 2008 02:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/19/156948.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/156948.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/19/156948.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/156948.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/156948.aspx</trackback:ping><description>&lt;P&gt;今日見かけた不思議なコード。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;convert(buffer, szMoney);
total += buffer;
&lt;/PRE&gt;
&lt;P&gt;別段普通のコードです。&lt;/P&gt;
&lt;P&gt;ところが、ファイル名を見るとxxxx.c なんですね。&lt;BR&gt;Cの場合は参照渡しがないので、bufferの値が書き変わることはありません。&lt;/P&gt;
&lt;P&gt;ということは、すでにポインタを渡している？&lt;BR&gt;もしくはbufferは配列？&lt;BR&gt;どちらにしろ、直後の構文が意味不明。&lt;BR&gt;ただ単にバグっているコード？&lt;/P&gt;
&lt;P&gt;grepしてもconverは出てこず&amp;#8230;近くのソースにはない様子。&lt;BR&gt;bufferはlong long だということが判明。&lt;BR&gt;64bitだとこのコードが動く？　それはないよな&amp;#8230;&lt;/P&gt;
&lt;P&gt;仕方なくgrep範囲を全ソースに拡大！&lt;/P&gt;
&lt;P&gt;何のことはない、convertは#define でした。&lt;BR&gt;思い込みって怖いですね。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/156948.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]魔法少女 マジカル☆リスト</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/10/156097.aspx</link><pubDate>Wed, 10 Sep 2008 21:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/10/156097.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/156097.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/10/156097.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/156097.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/156097.aspx</trackback:ping><description>&lt;P&gt;私リスト、魔法の国から来た11歳の女の子だよ！♪&lt;BR&gt;&amp;#8230;という話じゃないです。&lt;/P&gt;
&lt;P&gt;以前、単方向リストの話題を振りました。&lt;BR&gt;単方向リストは双方向リストほど自由度がない反面、&lt;BR&gt;要素に付与しているポインタが半分で済むため、メモリ消費量が抑えられます。&lt;/P&gt;
&lt;P&gt;要素が10000個あれば、32bit環境だと40KBの節約になるわけです。&lt;BR&gt;&lt;S&gt;40KB分のメモリを増設すれば解決ですね。&lt;/S&gt;&lt;/P&gt;
&lt;P&gt;これを丸く収めるいい方法があります。&lt;BR&gt;それがマジックリスト。&lt;BR&gt;単方向のメモリ消費量で、双方向の自由度！&lt;BR&gt;つまり、正方向、逆方向のどちらでも辿れるのに、&lt;BR&gt;要素毎のポインタが１つだけというリストです。&lt;/P&gt;
&lt;P&gt;ってなわけで作ってみました。&lt;A href="http://izmktr.wankuma.com/200809/magiclist.zip"&gt;[download]&lt;BR&gt;&lt;/A&gt;要点を抜粋したソースが以下です。&lt;/P&gt;
&lt;P&gt;&lt;PRE class=Cpp name="code"&gt;
template&amp;lt;typename T&amp;gt;
class _magic_Node{
  unsigned int addpointer;
  T value;
  _magic_Node&amp;lt;T&amp;gt; *otherside(_magic_Node&amp;lt;T&amp;gt; *p){
    unsigned int io = addpointer ^ ((unsigned int)p);
    return (_magic_Node&amp;lt;T&amp;gt; *) io;
  }
  void setptr(_magic_Node&amp;lt;T&amp;gt; *prev, _magic_Node&amp;lt;T&amp;gt; *next){
    addpointer = ((unsigned int) prev) ^ ((unsigned int) next);
  }
  void changeptr(_magic_Node&amp;lt;T&amp;gt; *before, _magic_Node&amp;lt;T&amp;gt; *after){
    addpointer ^= ((unsigned int) after) ^ ((unsigned int) before);
  }
  _magic_Node(T t, _magic_Node&amp;lt;T&amp;gt; *prev, _magic_Node&amp;lt;T&amp;gt; *next):value(t){
    setptr(prev, next);
  }
  ~_magic_Node(){}
};
&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;見てのとおり、Tの他にはunsigned intしかメンバ変数を持っていません。&lt;/P&gt;
&lt;P&gt;setptr()はprev, nextのポインタを受け取り接続情報として格納します。&lt;BR&gt;othersize()は、片方のポインタを受け取り、もう一方のポインタを返します。&lt;BR&gt;changeptr()は、接続情報を変更します。&lt;/P&gt;
&lt;P&gt;リストは基本的に先頭か末尾から順に辿ることしか出来ません。&lt;BR&gt;つまり、prevとnextのどちらかの情報は持っているわけです。&lt;BR&gt;そこで二つのポインタのアドレスを重ね合わせた値を持っておいて、&lt;BR&gt;片方の情報を受け取ることでもう一方の情報を取り出すようにすればいいのです。&lt;/P&gt;
&lt;P&gt;本来のマジックリストは加算を使うのですが、ここではXORを使ってみました。&lt;/P&gt;
&lt;P&gt;アドレスをただの整数としてみなした計算を行っているので、&lt;BR&gt;セーフティを謳う言語ではこれを実装することはできません。&lt;BR&gt;分かりやすく言い換えると、フリーダムなC言語万歳。&lt;/P&gt;
&lt;P&gt;なお、イテレータの前後で要素が追加/削除された場合、&lt;BR&gt;イテレータの移動が未定義になってしまいます。&lt;BR&gt;また、イテレータ側で要素の前後の面倒を見ないといけないので、&lt;BR&gt;イテレータのサイズが通常の双方向リストより大きいです。&lt;BR&gt;end()の生成コストも大きくなっているのが問題ですね&amp;#8230;。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/156097.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]リストカット(メモリ的な意味で)</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/08/155808.aspx</link><pubDate>Mon, 08 Sep 2008 01:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/08/155808.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/155808.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/08/155808.aspx#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/155808.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/155808.aspx</trackback:ping><description>&lt;P&gt;ネタ元＞&lt;A href="http://d.hatena.ne.jp/faith_and_brave/20080905/1220611240"&gt;[C++] C++0x forward_list&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;C++0xに単方向リストが実装されるという話なのですが、&lt;BR&gt;その際、size()が実装されないということらしいです。&lt;BR&gt;理由として、size()を持つメンバ変数領域が無駄だそうで。&lt;/P&gt;
&lt;P&gt;これは100歩譲って認めるとしても、push_back()も実装されないそうです。&lt;BR&gt;単方向なのでend()からは辿ることができないから無理もないのですが、&lt;BR&gt;size()のメンバ変数を持つことを嫌う人が、&lt;BR&gt;push_back()のためにbefore_endをメンバ変数にもつとは思えません。&lt;/P&gt;
&lt;P&gt;となると、push_front()を主に使ってプログラムを組むことになるのですが、&lt;BR&gt;今までのSTLのコンテナがpush_back()を中心に作られている上、&lt;BR&gt;先頭から物が詰め込まれるというのはなかなか使い勝手が悪く思えます。&lt;/P&gt;
&lt;P&gt;そうなると、この辺を実装したrich_flistが欲しいわけですが、どうやって作るか問題です。&lt;BR&gt;ですが、デストラクタにvirtualが付いていませんので、これでは派生はできません。&lt;BR&gt;virtualをつけてしまうとvfptrが付いてしまうため、size()のメンバ変数を嫌う&amp;#8230;(以下略)&lt;/P&gt;
&lt;P&gt;となると、所有で解決するか、一から作り直すことになるでしょう。&lt;BR&gt;どちらにしろ、forward_listとrich_flistの両方を受け入れる関数を作るには&lt;BR&gt;テンプレートを使ったプログラムが必要になります。&lt;/P&gt;
&lt;P&gt;もっとも、forward_listの発端がメモリの節約なので、&lt;BR&gt;メモリ消費量が増える機能拡張はなし、というのはわかるのですが&amp;#8230;。&lt;/P&gt;
&lt;P&gt;要素毎に逆方向ポインタがつくのは嫌だけど、size()やpush_back()は使いたい、&lt;BR&gt;そういうニーズをうまく解消する方法はないものですかねぇ。&lt;/P&gt;
&lt;P&gt;#そこで、マジックリストを標準ライブラリに！！&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/155808.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]ChronoがTrigger</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/03/155279.aspx</link><pubDate>Wed, 03 Sep 2008 00:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/03/155279.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/155279.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/03/155279.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/155279.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/155279.aspx</trackback:ping><description>&lt;P&gt;C++Dayで、&lt;A href="http://d.hatena.ne.jp/faith_and_brave/"&gt;アキラ&lt;/A&gt;さんからChronoという日付/時間型が入るという話を聞きました。&lt;/P&gt;
&lt;P&gt;日付/時間だったら、DateTimeという名前が一般的です。&lt;BR&gt;ただ、これだといろんなプログラムで競合しそうですから避けるとしても、&lt;BR&gt;Chronoという名前が出てくるところがいいですね。&lt;/P&gt;
&lt;P&gt;私がプログラムを作る時、よく使う名称があります。&lt;BR&gt;あまり聞きなれない単語で、そのものを表すのにいい言葉をちょくちょく捜しています。&lt;BR&gt;そんなのをちょこっと紹介。&lt;/P&gt;
&lt;P&gt;Persona&lt;BR&gt;操作する対象のクラスです。&lt;BR&gt;STGなら自機、格闘ゲームならキャラクタ、パズルならフィールドとかを総合的に扱います。&lt;BR&gt;そもそもCharactorという名前がC言語だと使いにくいし、&lt;BR&gt;Humanは人間じゃないものはどーするんだとか、Playerはコンピュータが操作しても？ということでこれ。&lt;/P&gt;
&lt;P&gt;Prologue/Epilogue&lt;BR&gt;初期処理/終了処理。&lt;BR&gt;何かが始まる予感がして、いまだに使い続けています。&lt;BR&gt;元ネタはmaster.lib(Bio_100%が出したライブラリ)のサンプルプログラムです。&lt;BR&gt;このサンプルプログラムは関数ポインタを覚えるきっかけにもなりました。&lt;/P&gt;
&lt;P&gt;Catalog/Jollet&lt;BR&gt;どちらもデータの集合体を指しています。&lt;BR&gt;ItemCatalogやEquipCatalogなど。&lt;BR&gt;Catalogはゲーム開始時に読み込まれて、終始変化のないもので、&lt;BR&gt;Jolletは数が減ったり増えたりデータが書き変わったりするものに使ってます。&lt;/P&gt;
&lt;P&gt;pluck&lt;BR&gt;カードゲームを作ってた時、ある動作で困って辞書をひっくり返して出てきた単語。&lt;BR&gt;必ず存在する「カードを引く」という動作は「ドロー！モンスターカード！！」で人気のdrawですが、&lt;BR&gt;どう考えてもdrawは描画メソッドの名前以外につけるのはまずいですので探しました。&lt;BR&gt;勇気と幸運の剣でバグを撃つ！という気持ちで。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/155279.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]日輪の存在</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/01/154897.aspx</link><pubDate>Mon, 01 Sep 2008 02:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/01/154897.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/154897.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/01/154897.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/154897.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/154897.aspx</trackback:ping><description>&lt;P&gt;元ネタ＞&lt;A href="http://blogs.wankuma.com/tyappi/archive/2008/08/31/154858.aspx"&gt;C/C++ の将来性&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;「将来性がない」だなんてしけた釣りだクマね。&lt;BR&gt;そんな餌に俺様がクマー！！！！！&lt;BR&gt;#わんくま同盟だから釣られるのは仕方ない&lt;/P&gt;
&lt;P&gt;そもそも、将来性ってなんでしょうね。&lt;BR&gt;AdaとかB言語あたりはほぼ絶滅といっていいんでしょうけど&amp;#8230;。&lt;BR&gt;COBOLはいまだに生き続けてますね、両津勘吉並の生命力です。&lt;/P&gt;
&lt;P&gt;C/C++が低レベル層の開発に使われるのは間違いなく、&lt;BR&gt;ここに代替できる言語がアセンブラぐらいしかない以上、この分野では死なないでしょう。&lt;/P&gt;
&lt;P&gt;ですが、それは死んでないだけで今のCOBOLと何ら変わりありません。&lt;/P&gt;
&lt;P&gt;ネットゲームで誰かが言った言葉です。&lt;BR&gt;「面白いネトゲがあるわけではない、面白い"人"がいるネトゲがあるだけだ。」&lt;/P&gt;
&lt;P&gt;将来性は言語的な仕様が作るものではなく、人が作るものだと思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/154897.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]君の名をつければ</title><link>http://blogs.wankuma.com/izmktr/archive/2008/08/30/154703.aspx</link><pubDate>Sat, 30 Aug 2008 00:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/08/30/154703.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/154703.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/08/30/154703.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/154703.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/154703.aspx</trackback:ping><description>&lt;P&gt;今日は横浜勉強会ですよ&lt;BR&gt;今回はみんなこようよ～とは言えないのでこんなのやるよ～って話を。&lt;/P&gt;
&lt;P&gt;テンプレートの解説で、どういう場面で使うべきかというのを&lt;BR&gt;無い頭を絞って出した結果、こんなの出ました&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;defineで実装していたマクロの代替&lt;/LI&gt;
&lt;LI&gt;式を関数に変換&lt;/LI&gt;
&lt;LI&gt;ビット幅や整数・実数を可変にした数値型&lt;/LI&gt;
&lt;LI&gt;拡張版 void *&lt;/LI&gt;
&lt;LI&gt;実質的兄弟クラスとしての利用&lt;/LI&gt;
&lt;LI&gt;インライン展開&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;なんか、かっこわるい&lt;BR&gt;なに、拡張版void*って！&lt;/P&gt;
&lt;P&gt;で、GoFデザインパターンみたいに名前付けたらかっこいいのかも！&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;safety macro&lt;/LI&gt;
&lt;LI&gt;functor&lt;/LI&gt;
&lt;LI&gt;numeric&lt;/LI&gt;
&lt;LI&gt;carrior&lt;/LI&gt;
&lt;LI&gt;ringer&lt;/LI&gt;
&lt;LI&gt;inline&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;お、意外にいけてるんじゃ？&lt;/P&gt;
&lt;P&gt;#そもそも分類がおかしい気もしないでもない&lt;BR&gt;#GoFで思い出したけど、&lt;A href="http://www13.plala.or.jp/french/french_index.htm"&gt;ぐろー部&lt;/A&gt;ハマり中なんで対戦する人いないですかね？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/154703.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C++]終端のない文字列をうたおう</title><link>http://blogs.wankuma.com/izmktr/archive/2008/08/13/152938.aspx</link><pubDate>Wed, 13 Aug 2008 23:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/08/13/152938.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/152938.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/08/13/152938.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/152938.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/152938.aspx</trackback:ping><description>&lt;P&gt;C言語で文字列を扱うときは、終端ありきでほとんどの関数が構成されています。&lt;BR&gt;たとえば、最大で12文字入る場合は、13文字分のバッファを用意するのが普通です。&lt;BR&gt;ですが、バッファを12文字しか取らず、最大長だった場合は&lt;BR&gt;終端がないという形態で組む場合というのも往々にしてあります。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;void foo(){
  //C++だとこの表記駄目らしい
  //char name[5] = "Izumi";
  char name[5] = {'I','z','u','m','i'};
  char message[20] = "hello";
  // NGパターン
  {
    // これだと後ろの文字と連結して10が入ってしまう可能性が！
    int len = strlen(name);
    // 当然これも駄目
    char str[100];
    strcpy(str, name);
    //stringに代入するときも当然アウト
    std::string s = name;
  }
  // OKパターン
  {
    // ちゃんと5がはいる
    int len = strnlen(name, sizeof(name));
    // コピーした先にも終端がつかないことがあるので注意
    char str[100];
    strncpy(str, name, sizeof(str));
    // stringに入れるときはコンストラクタで長さを指定
    std::string s(name, sizeof(name));
  }
}
&lt;/PRE&gt;
&lt;P&gt;この辺は簡単なのですが、何より困るのがprintf。&lt;BR&gt;終端なしの文字列を流し込めればなぁ&amp;#8230;と思う人に。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;void foo(){
  char name[5] = {'I','z','u','m','i'};
  char message[20] = "hello";
  
  // 長さとして小数点以下の値を使って指定
  printf("%-.5s\n", name);
  // 長さを外部から与えたいときは*を使う
  printf("%-.*s\n", sizeof(name), name);
}  
&lt;/PRE&gt;
&lt;P&gt;なお、バッファオーバラン対策にもなりますので、&lt;BR&gt;終端ありの場合もこういう造りにしておくと安心です。&lt;/P&gt;
&lt;P&gt;#コメントの指摘を受けてソース部分修正&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/152938.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>