<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>いちばんやさしいゲームの作り方 &#187; ポインタ</title>
	<atom:link href="http://www.game-create.com/archives/tag/%e3%83%9d%e3%82%a4%e3%83%b3%e3%82%bf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.game-create.com</link>
	<description>文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ</description>
	<lastBuildDate>Tue, 08 Jun 2010 01:28:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>shared_ptr のだめな例を試そうとして失敗…</title>
		<link>http://www.game-create.com/archives/2642</link>
		<comments>http://www.game-create.com/archives/2642#comments</comments>
		<pubDate>Sat, 26 Dec 2009 14:29:24 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[ポインタ]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2642</guid>
		<description><![CDATA[「やってはいかんとわかっていても、それをやったときのエラーを確認しろ」というのが師匠流なのですが、 shared_ptr でそれをやろうとしてうまくいきません。

#include &#60;iostream&#62;
# [...]]]></description>
			<content:encoded><![CDATA[<p>「やってはいかんとわかっていても、それをやったときのエラーを確認しろ」というのが師匠流なのですが、 shared_ptr でそれをやろうとしてうまくいきません。</p>
<p><span id="more-2642"></span></p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-prepro">#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">iostream</span><span class="hl-quotes">&gt;</span><span class="hl-prepro">
#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">boost/smart_ptr/shared_ptr.hpp</span><span class="hl-quotes">&gt;</span><span class="hl-prepro">

</span><span class="hl-types">class </span><span class="hl-identifier">aClass
</span><span class="hl-brackets">{
</span><span class="hl-reserved">public</span><span class="hl-code">:
  </span><span class="hl-identifier">aClass</span><span class="hl-brackets">()
  {
    </span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">cout</span><span class="hl-code"> &lt;&lt;</span><span class="hl-quotes">&quot;</span><span class="hl-string">Created !</span><span class="hl-quotes">&quot;</span><span class="hl-code"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">endl</span><span class="hl-code">;
  </span><span class="hl-brackets">}</span><span class="hl-code">;
  ~</span><span class="hl-identifier">aClass</span><span class="hl-brackets">()
  {
    </span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">cout</span><span class="hl-code"> &lt;&lt;</span><span class="hl-quotes">&quot;</span><span class="hl-string">Deleted !</span><span class="hl-quotes">&quot;</span><span class="hl-code"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">endl</span><span class="hl-code">;
  </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-default">;

</span><span class="hl-types">int </span><span class="hl-identifier">main</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">argc</span><span class="hl-code">, </span><span class="hl-types">char</span><span class="hl-code">* </span><span class="hl-identifier">argv</span><span class="hl-brackets">[])
{
  </span><span class="hl-identifier">aClass</span><span class="hl-code"> *</span><span class="hl-identifier">rawPtr</span><span class="hl-code"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">aClass</span><span class="hl-brackets">()</span><span class="hl-code">;

  </span><span class="hl-identifier">boost</span><span class="hl-code">::</span><span class="hl-identifier">shared_ptr</span><span class="hl-code">&lt;</span><span class="hl-identifier">aClass</span><span class="hl-code">&gt; </span><span class="hl-identifier">ptr1</span><span class="hl-brackets">(</span><span class="hl-identifier">rawPtr</span><span class="hl-brackets">)</span><span class="hl-code">;
  </span><span class="hl-identifier">boost</span><span class="hl-code">::</span><span class="hl-identifier">shared_ptr</span><span class="hl-code">&lt;</span><span class="hl-identifier">aClass</span><span class="hl-code">&gt; </span><span class="hl-identifier">ptr2</span><span class="hl-brackets">(</span><span class="hl-identifier">rawPtr</span><span class="hl-brackets">)</span><span class="hl-code">;

  </span><span class="hl-reserved">return </span><span class="hl-number">0</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>書籍によるとこれは失敗例らしく、自分もそう思います。最後に同じ領域が２回 delete されそうな気がします。ただ、手持ちの環境では不正終了などもなく、デストラクタが２回実行されて終わりました。 Windows って不要なメモリを回収するのが早いような印象があったのですが、メモリの残滓だけでもデストラクタが動くのでしょうか。</p>
<p>関数とか、スコープを違えると不正終了するかも…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2642/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ポインタを typedef するとき、 ～Ptr とつけることにしてみる</title>
		<link>http://www.game-create.com/archives/2570</link>
		<comments>http://www.game-create.com/archives/2570#comments</comments>
		<pubDate>Thu, 10 Dec 2009 14:40:54 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[命名規則]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2570</guid>
		<description><![CDATA[Player クラスのポインタだったら PlayerPtr とかそんな感じです。

あんまり単語を略すのが好きではなく、今までは PlayerPointer という名前が第一候補だったのですが、もし、マウスポインタを意味 [...]]]></description>
			<content:encoded><![CDATA[<p>Player クラスのポインタだったら PlayerPtr とかそんな感じです。</p>
<p><span id="more-2570"></span></p>
<p>あんまり単語を略すのが好きではなく、今までは PlayerPointer という名前が第一候補だったのですが、もし、マウスポインタを意味する MousePointer という型を考えたとき、それのポインタの名前が MousePointerPointer になってしまいます。これだと Mouse** なのか MousePointer* なのか区別がつきにくく、言語の用語は略しても良いルールを新設しました。</p>
<p>色々とコードを表に出すことを考えてスタイルを再考しているのですが、いかんせん自分一人なので、いくら考えても安心できません…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2570/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>後悔先に立たず &#8211; boost::shared_ptr</title>
		<link>http://www.game-create.com/archives/2425</link>
		<comments>http://www.game-create.com/archives/2425#comments</comments>
		<pubDate>Sun, 08 Nov 2009 14:14:39 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ポインタ]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2425</guid>
		<description><![CDATA[仕事は WEB 系なんですが、ゲーム制作に興味ある方とお話ししていてスマートポインタ（ Boost の shared_ptr ）の話題になることがありました。
普段 C/C++ に触れていないと、その存在意義もわかりにく [...]]]></description>
			<content:encoded><![CDATA[<p>仕事は WEB 系なんですが、ゲーム制作に興味ある方とお話ししていてスマートポインタ（ Boost の shared_ptr ）の話題になることがありました。</p>
<p>普段 C/C++ に触れていないと、その存在意義もわかりにくいでしょうし、ほとんど理解してもらうのをあきらめていたところがあるのですが、よく考えたらハードリンクを例にとると簡単に伝わったのかもしれません。</p>
<p><span id="more-2425"></span></p>
<p>なんでそのとき気づかなかったのかと後悔しそうになります（残念ながら、もう、会う機会もない方々だと思いますし）。たぶん、本気でゲーム作る用事がなかったので問題ないと思いますが、珍しく良い例えがある分野だっただけにひらめきの悪さが悔やまれます。</p>
<p>ちょっと昔のことを思い出してみた日曜日の夜更け。お仕事、今日も終わりませんでした。明日からもがんばります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CPU が Java の仮想コードを理解したら新世界</title>
		<link>http://www.game-create.com/archives/2018</link>
		<comments>http://www.game-create.com/archives/2018#comments</comments>
		<pubDate>Thu, 30 Jul 2009 16:23:38 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[コンピュータ]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[スタック]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[例外]]></category>
		<category><![CDATA[組み込み系]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2018</guid>
		<description><![CDATA[ゲームを始め、組み込みは難しい、難しいというか経験のない人間がうかつに手を出せないという印象があります。…が、最近、 Java の VM が載っている CPU があるらしく、そういったハードが対象の場合、昔ほど基礎知識が [...]]]></description>
			<content:encoded><![CDATA[<p>ゲームを始め、組み込みは難しい、難しいというか経験のない人間がうかつに手を出せないという印象があります。…が、最近、 Java の VM が載っている CPU があるらしく、そういったハードが対象の場合、昔ほど基礎知識がいらないことがあるとのお話を聞きました。</p>
<p><span id="more-2018"></span></p>
<p>ローカル変数に大きな配列を作ったり、ローカル変数へのポインタを戻り値として返したり、こういうのは組み込みに限らずやばいコードなのですが、 Java なら話は別です。当然、メモリが許せばの話になりますが、必ずしも機械語やＣ言語の知識が無いと組み込みに手がつけられないという状況に変化があるのかもしれません。</p>
<p>ただ、必要以上にメモリを食いつぶさないノウハウなんかはしっかりと身につけておかないとまずそうです。これは組み込みに限らず Java のような言語を使うときの注意点だと思います（参照が残るとオブジェクトが解体されず、メモリを圧迫する）。</p>
<p>「果たして VM が載っている CPU でのプログラムでは例外を飛ばすことができるのか？」とか、まだまだ気になることはたくさんありますが、これ以上訊けなかったので、また次の機会に伺おうかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2018/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>メンバ関数へのポインタを取得する</title>
		<link>http://www.game-create.com/archives/1646</link>
		<comments>http://www.game-create.com/archives/1646#comments</comments>
		<pubDate>Sat, 02 May 2009 18:35:46 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[クラス]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[メンバ]]></category>
		<category><![CDATA[関数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=1646</guid>
		<description><![CDATA[メンバ関数へのポインタを取得するためには、次のようにします。
void (SomeClass::*pointer)() = &#38;SomeClass::someMethod;

以下、例です。
#include &#038;l [...]]]></description>
			<content:encoded><![CDATA[<p>メンバ関数へのポインタを取得するためには、次のようにします。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-types">void </span><span class="hl-brackets">(</span><span class="hl-identifier">SomeClass</span><span class="hl-code">::*</span><span class="hl-identifier">pointer</span><span class="hl-brackets">)()</span><span class="hl-default"> = &amp;</span><span class="hl-identifier">SomeClass</span><span class="hl-default">::</span><span class="hl-identifier">someMethod</span><span class="hl-default">;</span></pre></div></div>
<p><span id="more-1646"></span></p>
<p>以下、例です。</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-prepro">#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">iostream</span><span class="hl-quotes">&gt;</span><span class="hl-prepro">

</span><span class="hl-types">class </span><span class="hl-identifier">SomeClass
</span><span class="hl-brackets">{
</span><span class="hl-reserved">public</span><span class="hl-code">:
  </span><span class="hl-types">void </span><span class="hl-identifier">someMethod</span><span class="hl-brackets">()
  {
    </span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">cout</span><span class="hl-code"> &lt;&lt;</span><span class="hl-quotes">&quot;</span><span class="hl-string">ポインタ経由でメソッドを読んでみた</span><span class="hl-quotes">&quot;</span><span class="hl-code"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">endl</span><span class="hl-code">;
  </span><span class="hl-brackets">}
}</span><span class="hl-default">;

</span><span class="hl-types">int </span><span class="hl-identifier">main</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">argc</span><span class="hl-code">, </span><span class="hl-types">char</span><span class="hl-code"> *</span><span class="hl-identifier">argv</span><span class="hl-brackets">[])
{
  </span><span class="hl-types">void </span><span class="hl-brackets">(</span><span class="hl-identifier">SomeClass</span><span class="hl-code">::*</span><span class="hl-identifier">pointer</span><span class="hl-brackets">)()</span><span class="hl-code"> = &amp;</span><span class="hl-identifier">SomeClass</span><span class="hl-code">::</span><span class="hl-identifier">someMethod</span><span class="hl-code">;

  </span><span class="hl-identifier">SomeClass</span><span class="hl-code"> *</span><span class="hl-identifier">instance</span><span class="hl-code"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">SomeClass</span><span class="hl-brackets">()</span><span class="hl-code">;

  </span><span class="hl-brackets">(</span><span class="hl-identifier">instance</span><span class="hl-code">-&gt;*</span><span class="hl-identifier">pointer</span><span class="hl-brackets">)()</span><span class="hl-code">; </span><span class="hl-comment">// ポインタ経由でメソッドを読んでみた

  </span><span class="hl-reserved">delete </span><span class="hl-identifier">instance</span><span class="hl-code">;

  </span><span class="hl-reserved">return </span><span class="hl-number">0</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>「す、すごい、これは応用範囲が広そうだ！」と思う前に、ポリモーフィズムを検討しましょう。Ｃ言語の関数ポインタと同じ文脈で使わない方が良いと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/1646/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>特定の位置にプログラムを注入する</title>
		<link>http://www.game-create.com/archives/978</link>
		<comments>http://www.game-create.com/archives/978#comments</comments>
		<pubDate>Tue, 18 Nov 2008 23:43:10 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XOOPS Cube]]></category>
		<category><![CDATA[ポインタ]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=978</guid>
		<description><![CDATA[PHP のようなインタプリタ言語では、ソースコードの動的読み込みやメソッドの動的追加など、プログラムを拡張するポイントを簡単に作ることができますが、コンパイル言語である C++ ではそうはいきません。やろうとするとコール [...]]]></description>
			<content:encoded><![CDATA[<p>PHP のようなインタプリタ言語では、ソースコードの動的読み込みやメソッドの動的追加など、プログラムを拡張するポイントを簡単に作ることができますが、コンパイル言語である C++ ではそうはいきません。やろうとするとコールバック関数などを考えると思うのですが、それだと関数ひとつしか登録できません。</p>
<p><span id="more-978"></span></p>
<p>もし、何かのイベントが発生した際にあらかじめ設定しておいた関数を複数呼び出したい場合は C# のデリゲータに近い構造にする必要があります。デリゲータはコールバックと発想は似ていますが、複数の関数を登録できる点で異なっています。コールバック関数でも目的は達成できるのですが、コールバック関数の場合は自分が所有するオブジェクトしか扱うことができません。その点でデリゲータに優位性があります。</p>
<p>私はこれを「言語の機能だから」と C++ ではあきらめていたのですが、冷静に考えてみると関数へのポインタを配列で持っておけばできそうですね。実際に XOOPS Cube ではそれに近い実装で実現しています（もっとも、 XOOPS Cube は元々スクリプト言語ですので、それ自体に拡張性があるわけですが）。</p>
<p>問題はインタフェースを完璧に決めておかないといけないということですが、そこら辺はがんばって調整したいと思います。というか、それが嫌ならコンパイル言語は使えないと思います。</p>
<p>着実に同人ゲーム開発への道を進んでおります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/978/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ポインタ変数を何も指していない状態にする</title>
		<link>http://www.game-create.com/archives/877</link>
		<comments>http://www.game-create.com/archives/877#comments</comments>
		<pubDate>Wed, 22 Oct 2008 14:28:38 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[変数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=877</guid>
		<description><![CDATA[ポインタ変数を何も指していない状態にするためには null 値を設定します。

ポインタ変数に null 値を設定するためには数値の０を代入します。このようにして作った null 値を指しているポインタを null ポイ [...]]]></description>
			<content:encoded><![CDATA[<p>ポインタ変数を何も指していない状態にするためには null 値を設定します。</p>
<p><span id="more-877"></span></p>
<p>ポインタ変数に null 値を設定するためには数値の０を代入します。このようにして作った null 値を指しているポインタを null ポインタと呼びます。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointer</span><span class="hl-default"> = </span><span class="hl-number">0</span><span class="hl-default">;</span></pre></div></div>
<p>ひとつ注意点があります。ポインタ変数は０を代入することで「何も指していないポインタ」、つまり null ポインタにすることができますが、 null ポインタの値が０とは限りません。つまり、次のようなコードは正しく動作しない可能性があります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">struct </span><span class="hl-identifier">SomeStruct
</span><span class="hl-brackets">{
  </span><span class="hl-types">int</span><span class="hl-code"> *</span><span class="hl-identifier">pointerA</span><span class="hl-code">;
  </span><span class="hl-types">int</span><span class="hl-code"> *</span><span class="hl-identifier">pointerB</span><span class="hl-code">;
  </span><span class="hl-types">int</span><span class="hl-code"> *</span><span class="hl-identifier">pointerC</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-default">;

</span><span class="hl-types">int </span><span class="hl-identifier">main</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">argc</span><span class="hl-code">, </span><span class="hl-types">char</span><span class="hl-code"> *</span><span class="hl-identifier">argv</span><span class="hl-brackets">[])
{
  </span><span class="hl-types">struct </span><span class="hl-identifier">SomeStruct sample</span><span class="hl-code">;

  </span><span class="hl-comment">// 0 で初期化を試みる…
  // しかし null ポインタの値が 0 とは限らない！
  </span><span class="hl-identifier">memset</span><span class="hl-brackets">(</span><span class="hl-code">&amp;</span><span class="hl-identifier">sample</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-reserved">sizeof</span><span class="hl-brackets">(</span><span class="hl-identifier">SomeStruct</span><span class="hl-brackets">))</span><span class="hl-code">;

  </span><span class="hl-reserved">return </span><span class="hl-number">0</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>Windows など、たいていの環境では正しく動作すると思いますが、一応 null ポインタの値が 0xABCDEF というような意味のわからない値でも良いことになっています。しかし、そのような環境でも null ポインタを作るためには０を代入する必要があるため注意が必要です。</p>
<p>しかし、たいていの方は０という数値の代わりに NULL 定数を使います。理由はその方が読みやすいからです。また、ほかの言語では null 値を意味するキーワードが存在するため、言語としてのスタイルをあわせておくという事情もあります。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointer</span><span class="hl-default"> = </span><span class="hl-prepro">NULL</span><span class="hl-default">;</span></pre></div></div>
<p>ちなみに次期 C++ 言語である C++0x では nullptr というキーワードの導入が検討されており、 NULL に変わる指定ができるようになる可能性があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/877/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 年前から大好評のポインタ解説書</title>
		<link>http://www.game-create.com/archives/865</link>
		<comments>http://www.game-create.com/archives/865#comments</comments>
		<pubDate>Sun, 19 Oct 2008 12:44:04 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[書籍]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=865</guid>
		<description><![CDATA[プログラミング界におけるベストセラーであるポインタ解説書があります。


私は荒療治でポインタを覚えましたが、この本でさらに理解を深めました。自分の中の良書ランキングでも３本の指に入るほどの品質です。この本を読むと「ああ [...]]]></description>
			<content:encoded><![CDATA[<p>プログラミング界におけるベストセラーであるポインタ解説書があります。</p>
<p><span id="more-865"></span></p>
<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=game-create-22&#038;o=9&#038;p=8&#038;l=as1&#038;asins=4774111422&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" class="left"></iframe></p>
<p>私は荒療治でポインタを覚えましたが、この本でさらに理解を深めました。自分の中の良書ランキングでも３本の指に入るほどの品質です。この本を読むと「ああ、 Byerkut はここに影響を受けているのか」とわかるようになって、ちょっと優位な気分になれます。</p>
<ul style="clear:both;">
<li>そもそもポインタの概念がわからない</li>
<li>どこでポインタを使えばいいのかわからない</li>
<li>他人がポインタを使っている部分の読み方がわからない</li>
<li>ポインタ変数定義の構文が覚えづらい</li>
<li>ポインタを読みやすく書く方法がわからない</li>
<li>完全に理解できなくても良いから重要な部分だけ知りたい</li>
</ul>
<p>ひとつでも当てはまったら買う価値ありです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/865/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配列変数のメモリを動的に確保する</title>
		<link>http://www.game-create.com/archives/829</link>
		<comments>http://www.game-create.com/archives/829#comments</comments>
		<pubDate>Sat, 11 Oct 2008 12:41:29 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[delete 演算子]]></category>
		<category><![CDATA[new 演算子]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[メモリ]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=829</guid>
		<description><![CDATA[配列変数のメモリを動的に確保するためには new 演算子を使います。

基本はスカラー変数の場合と同じですが、配列の場合は書式が異なります。
// int と double でそれぞれ 100 個の要素を確保するとき
 [...]]]></description>
			<content:encoded><![CDATA[<p>配列変数のメモリを動的に確保するためには new 演算子を使います。</p>
<p><span id="more-829"></span></p>
<p>基本は<a href="http://www.game-create.com/archives/825">スカラー変数の場合</a>と同じですが、配列の場合は書式が異なります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// int と double でそれぞれ 100 個の要素を確保するとき
</span><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfIntArray</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">int</span><span class="hl-brackets">[</span><span class="hl-number">100</span><span class="hl-brackets">]()</span><span class="hl-default">;
</span><span class="hl-types">double</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfDoubleArray</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">double</span><span class="hl-brackets">[</span><span class="hl-number">100</span><span class="hl-brackets">]()</span><span class="hl-default">;</span></pre></div></div>
<p>おそらくメモリ確保の段階では間違えることも少ないと思いますが、問題はメモリ解放の場合です。 new で確保した配列メモリを解放するためには次のように書く必要があります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">delete </span><span class="hl-brackets">[] </span><span class="hl-identifier">pointerOfIntArray</span><span class="hl-default">;
</span><span class="hl-reserved">delete </span><span class="hl-brackets">[] </span><span class="hl-identifier">pointerOfDoubleArray</span><span class="hl-default">;</span></pre></div></div>
<p>delete の後にブラケットが必要である点に注意してください。これはプログラミングに慣れている人でもよく忘れてしまいます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/829/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>スカラー変数のメモリを動的に確保する</title>
		<link>http://www.game-create.com/archives/825</link>
		<comments>http://www.game-create.com/archives/825#comments</comments>
		<pubDate>Fri, 10 Oct 2008 07:43:07 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[delete 演算子]]></category>
		<category><![CDATA[new 演算子]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[メモリ]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=825</guid>
		<description><![CDATA[スカラー変数のメモリを動的に確保するためには new 演算子を使います。

ソースコードの中で変数を宣言すると、同時にそのデータを格納するためのメモリも確保されますが、逆に言うとソースコードの中で宣言しないとメモリは確保 [...]]]></description>
			<content:encoded><![CDATA[<p>スカラー変数のメモリを動的に確保するためには new 演算子を使います。</p>
<p><span id="more-825"></span></p>
<p>ソースコードの中で変数を宣言すると、同時にそのデータを格納するためのメモリも確保されますが、逆に言うとソースコードの中で宣言しないとメモリは確保されないことになります。この方法には「宣言するだけで必要なメモリを確保することができる」というメリットがある反面「コンパイル時にはプログラムに必要な変数とその個数をすべてリストアップしておく必要がある」というデメリットがあります。</p>
<p>つまり、メモリを自動的に確保するためには、プログラムを書いている段階で必要な変数とその個数が完全に決まっている必要があるのです。しかし、敵キャラの情報を格納する配列変数などはステージによって必要なサイズが違うかもしれません。しかし、メモリを自動的に確保する方法では、ステージに応じて変数のサイズを変えることはできず、無駄な領域が生まれてしまう可能性があります。</p>
<p>この問題を解決するためにはメモリを動的に確保します。</p>
<p>プログラムの実行が開始された後に「必要に応じてメモリを確保する」ためには new 演算子を使います。 new 演算子には確保したいデータの型情報を渡します。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// メモリを確保する
</span><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfInt</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">int</span><span class="hl-brackets">()</span><span class="hl-default">;
</span><span class="hl-types">double</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfDouble</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">double</span><span class="hl-brackets">()</span><span class="hl-default">;</span></pre></div></div>
<p>new 演算子の戻り値はポインタになりますので、前述の例のようにポインタ変数で受け取ります。普通の変数は new 演算子の戻り値としては不適切です。なぜかというと普通の変数はすでにメモリが割り当たっているからです。</p>
<p>new 演算子によるメモリの確保は大変便利ですが一点だけ注意すべき点があります。それは「使い終わったメモリを解放しなければならない」ということです。もし、使い終わったメモリを解放しないで放置しておくとメモリリークを起こし、プログラムが異常終了する可能性が高くなります。</p>
<p>new 演算子によって確保したメモリを解放するためには delete 演算子を使います。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// メモリを解放する
</span><span class="hl-reserved">delete </span><span class="hl-identifier">pointerOfInt</span><span class="hl-default">;
</span><span class="hl-reserved">delete </span><span class="hl-identifier">pointerOfDouble</span><span class="hl-default">;</span></pre></div></div>
<p>しかし、「 delete を自分で管理するのは面倒だなぁ」と感じられる方が大半かと思います。ご安心ください。 Boost というライブラリにスマートポインタという技術があります。スマートポインタを使うと delete を自分で実行する必要がありません。使われなくなったメモリを自動的にしてくれます。</p>
<p><a href="http://www.boost.org/" class="external">Boost</a></p>
<p>本ブログでもそのうち取り上げますので楽しみにお待ちください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/825/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
