<?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/hirase/category/1739.aspx</link><description>C/C++</description><managingEditor>T.Hirase</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>T.Hirase</dc:creator><title>[CUDA] CUDA CAPS</title><link>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx</link><pubDate>Sat, 03 Oct 2009 01:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181796.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx#Feedback</comments><slash:comments>60</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181796.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181796.aspx</trackback:ping><description>&lt;p&gt;うちのMacBookに載っているGeForce 9400Mで、どの程度、CUDA遊びができるか知りたかったので、コーディング。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
  int num_devices;
	cudaGetDeviceCount(&amp;num_devices);
	printf("number of devices : %d\n\n", num_devices);
	
	for (int device_id = 0; device_id &amp;lt; num_devices; ++device_id)
	{
		cudaDeviceProp device_properties;
		cudaGetDeviceProperties(&amp;device_properties, device_id);
		
    printf("name                     : %s\n" , device_properties.name                    ); /* char[256] */
    printf("totalGlobalMem           : %zd\n", device_properties.totalGlobalMem          ); /* size_t    */
    printf("sharedMemPerBlock        : %zd\n", device_properties.sharedMemPerBlock       ); /* size_t    */
    printf("regsPerBlock             : %d\n" , device_properties.regsPerBlock            ); /* int       */
    printf("warpSize                 : %d\n" , device_properties.warpSize                ); /* int       */
    printf("memPitch                 : %zd\n", device_properties.memPitch                ); /* size_t    */
    printf("maxThreadsPerBlock       : %d\n" , device_properties.maxThreadsPerBlock      ); /* int       */
    printf("maxThreadsDim            : {%d,%d,%d}\n", device_properties.maxThreadsDim[0], device_properties.maxThreadsDim[1], device_properties.maxThreadsDim[2]); /* int[3]    */
    printf("maxGridSize              : {%d,%d,%d}\n", device_properties.maxGridSize[0], device_properties.maxGridSize[1], device_properties.maxGridSize[2]); /* int[3]    */
    printf("clockRate                : %d\n" , device_properties.clockRate               ); /* int       */
    printf("totalConstMem            : %zd\n", device_properties.totalConstMem           ); /* size_t    */
    printf("major                    : %d\n" , device_properties.major                   ); /* int       */
    printf("minor                    : %d\n" , device_properties.minor                   ); /* int       */
    printf("textureAlignment         : %zd\n", device_properties.textureAlignment        ); /* size_t    */
    printf("deviceOverlap            : %d\n" , device_properties.deviceOverlap           ); /* int       */
    printf("multiProcessorCount      : %d\n" , device_properties.multiProcessorCount     ); /* int       */
    printf("kernelExecTimeoutEnabled : %d\n" , device_properties.kernelExecTimeoutEnabled); /* int       */
    printf("integrated               : %d\n" , device_properties.integrated              ); /* int       */
    printf("canMapHostMemory         : %d\n" , device_properties.canMapHostMemory        ); /* int       */
    printf("computeMode              : %d\n" , device_properties.computeMode             ); /* int       */
	}

  return 0;
}&lt;/pre&gt;
&lt;p&gt;結果は、こんな感じ。&lt;/p&gt;
&lt;pre style="color:white; background:black"&gt;number of devices : 1

name                     : GeForce 9400M
totalGlobalMem           : 266010624
sharedMemPerBlock        : 16384
regsPerBlock             : 8192
warpSize                 : 32
memPitch                 : 262144
maxThreadsPerBlock       : 512
maxThreadsDim            : {512,512,64}
maxGridSize              : {65535,65535,1}
clockRate                : 1100000
totalConstMem            : 65536
major                    : 1
minor                    : 1
textureAlignment         : 256
deviceOverlap            : 0
multiProcessorCount      : 2
kernelExecTimeoutEnabled : 1
integrated               : 1
canMapHostMemory         : 1
computeMode              : 0
&lt;/pre&gt;
&lt;p&gt;"Compute Capability" は "1.1" か（major.minor)。ちょっと古いな。"multiProcessorCount" = 2 ってことは、"Scalar Processor" = 2 * 8 = 16 ってことか。まぁ、ぼちぼちかな。Tesla C1060に比べれば少ないけど、まぁ、まぁ、実験くらいはできるなぁ。大学で使ってたXeon×8マシンと数的には一緒か（いや、全然意味が違うけど）。16 ってでも微妙なんだよなぁ。もうちょっと、せめて64SPくらいは欲しいところだぁ。&lt;/p&gt;
&lt;p&gt; totalGlobalMem =2GBになってるけど、9400Mってメインメモリと共有だから、これ、メインメモリのサイズだよなぁ。騙されるとこだった。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181796.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[CUDA] はじめてのCUDA的な。</title><link>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx</link><pubDate>Fri, 02 Oct 2009 01:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181763.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181763.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181763.aspx</trackback:ping><description>&lt;p&gt;CUDA開始。すごく入り口は簡単だけど、並列思考が求められる。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

__global__ void krnlTest(float* dstv, float* srcv)
{
  int idx = blockDim.x * blockIdx.x + threadIdx.x;  // thread index
  dstv[idx] = srcv[idx] * srcv[idx];
}

int main(void)
{
  const int    num     = 512;
  const size_t vecsize = num * sizeof(float);

  // allocate host memory
  float* host_dstv = (float*)malloc(vecsize);
  float* host_srcv = (float*)malloc(vecsize);

  // initialize input data
  for (int i = 0; i &lt; num; ++i) {
    host_srcv[i] = i;
  }

  // allocate kernel memory
  float* krnl_dstv;
  float* krnl_srcv;
  cudaMalloc((void**)&amp;krnl_dstv, vecsize);
  cudaMalloc((void**)&amp;krnl_srcv, vecsize);

  // transfer input data
  cudaMemcpy(krnl_srcv, host_srcv, vecsize, cudaMemcpyHostToDevice);

  // run (asynchronous)
  krnlTest&amp;lt;&amp;lt;&amp;lt;1,512&amp;gt;&amp;gt;&amp;gt;(krnl_dstv, krnl_srcv);

  // wait and transfer output data
  cudaMemcpy(host_dstv, krnl_dstv, vecsize, cudaMemcpyDeviceToHost);

  // free kernel memory
  cudaFree(krnl_dstv);
  cudaFree(krnl_srcv);

  // print
  for (int i = 0; i &lt; num; ++i) {
    printf("%f\n", host_dstv[i]);
  }

  // free host memory
  free(host_dstv);
  free(host_srcv);

  return 0;
}
&lt;/pre&gt;
&lt;p&gt;cuda?関数はCUDA組み込み関数。blockDimなどは組み込み変数。そしてその行はスレッドインデックスを取得するためのおまじない。あと、__global__はCUDA用コンパイルさせるための指定子。ホストPCからCUDA（カーネル）側の関数を呼び出すときは、不思議なおまじない「&amp;lt;&amp;lt;&amp;lt;d,b,n,m&amp;gt;&amp;gt;&amp;gt;」というのが関数名にくっつく。&lt;/p&gt;
&lt;p&gt;何か間違えているところあったら、Comments are welcomeです。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181763.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] 1から10までの総和をマクロでエレファントに解く。</title><link>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx</link><pubDate>Wed, 30 Sep 2009 22:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181733.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181733.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181733.aspx</trackback:ping><description>&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/09/30/181731.aspx"&gt;1+2+…+10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/andochin/archive/2009/09/30/181717.aspx"&gt;[C++] １から１０まで足す&lt;/a&gt;&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

#define SIGMA(X) SIGMA_##X
#define SIGMA_10 (10 + SIGMA_9)
#define SIGMA_9  ( 9 + SIGMA_8)
#define SIGMA_8  ( 8 + SIGMA_7)
#define SIGMA_7  ( 7 + SIGMA_6)
#define SIGMA_6  ( 6 + SIGMA_5)
#define SIGMA_5  ( 5 + SIGMA_4)
#define SIGMA_4  ( 4 + SIGMA_3)
#define SIGMA_3  ( 3 + SIGMA_2)
#define SIGMA_2  ( 2 + SIGMA_1)
#define SIGMA_1  ( 1          )

int main(void)
{
  printf("%d\n", SIGMA(10));
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;もう素直に数字並べて足し算した方がマシなレベル。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181733.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] C99</title><link>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx</link><pubDate>Fri, 25 Sep 2009 16:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181619.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181619.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181619.aspx</trackback:ping><description>&lt;p&gt;もうすでに10年まえの話ですが、C言語の新しい規格「&lt;a href="http://ja.wikipedia.org/wiki/C99"&gt;C99&lt;/a&gt;」(ISO/IEC 9899:1999)が制定されました。&lt;/p&gt;
&lt;p&gt;それなのに、それなのに、いまだに、こんな（↓）文法を使ったことはない。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;static int hoge[100] = {[10]=100, [20]=200,}&lt;/pre&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;int ret = 0;
ret = foo();
int j = bar();&lt;/pre&gt;
&lt;p&gt;一つ目は、「Designated Initializer」という初期化方法。二つ目は変数宣言位置がブロック先頭になくてもいいという法。&lt;/p&gt;
&lt;p&gt;なぜ、使わないって、そりゃ、&lt;strong&gt;Visual C++ コンパイラでエラーになるから&lt;/strong&gt;ですよ。痛い。痛いです。某オープンソースプロジェクトでガンガン使われてる。痛い、痛いです。そろそろ宣言位置くらい許してくれません？　何か副作用あります？&lt;/p&gt;
&lt;p&gt;※注意：C++の話じゃないですよ。&lt;/p&gt;

&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181619.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] new &amp; delete 血の掟</title><link>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx</link><pubDate>Sun, 30 Aug 2009 01:35:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/180648.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx#Feedback</comments><slash:comments>1396</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/180648.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/180648.aspx</trackback:ping><description>&lt;p&gt;今日のって、もう昨日の横浜勉強会から時既に12時間ほどが経過していますが、忘れないうちにεπιστημηさんのセッションで出てきたnew / delete 血の掟を簡単にまとめておきます。最後のケース６は、勝手に追加。やっちゃダメですよね？？&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;class Hoge { public: void func(){} };

int main()
{
	{ // 正しい new/delete の使い方
		Hoge* p = new Hoge();
		p-&gt;func();
		delete p;
	}
	
	{ // 正しい new[]/delete[] の使い方
		Hoge* p = new Hoge[10];
		p[0].func();
		delete[] p;
	}
	
	{ // 間違いケース１：お別れの挨拶を
		Hoge* p = new Hoge();
		p-&gt;func();
	}
	
	{ // 間違いケース２：なりすましに注意
		Hoge* p = new Hoge();
		p-&gt;func();
		p = new Hoge();
		p-&gt;func();
		delete p;
	}
	
	{ // 間違いケース３：お別れし過ぎ
		Hoge* p = new Hoge();
		p-&gt;func();
		delete p;
		// ... いろいろあって ...
		delete p;
	}
	
	{ // 間違いケース４：未練を残すな
		Hoge* p = new Hoge();
		delete p;
		p-&gt;func();
	}
	
	{ // 間違いケース５：強欲
		Hoge* p = new Hoge[10];
		p[10].func();
		delete[] p;
	}
	
	{ // 間違いケース６：すべて清算せよ
		Hoge* p = new Hoge[10];
		delete p;
	}
	
	return 0;
}
&lt;/pre&gt;
&lt;p&gt;間違えたときは、核ミサイルが発射され、家賃の振込が物凄い額で振り込まれ、消したはずの恥ずかしいアレが消えなかったり、いやむしろ、まぁくんのお母さんに見つかる場所に自動で移動したり、もう何が起きても不思議ではありません。えぇ、ですから、掟をやぶったら、何がオキテもしょうがありません。えぇ、仕様がありませんから。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/180648.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[VC] デバッグあり実行で、コンソールウィンドウが勝手に閉じる件</title><link>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx</link><pubDate>Fri, 21 Aug 2009 19:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/180377.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/180377.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/180377.aspx</trackback:ping><description>&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;windows.h&amp;gt;
int main()
{
  if ( IsDebuggerPresent() ) system("pause");
  return 0;
}&lt;/pre&gt;
&lt;p&gt;これで、デバッグ実行でも、デバッグなし実行でも、プログラム終了時に止まってくれる。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/180377.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C/C++/CLI/C#] 二値Enum型を作りたい。 </title><link>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</link><pubDate>Thu, 30 Jul 2009 23:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/179566.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/179566.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/179566.aspx</trackback:ping><description>&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx"&gt;[C#] Enumを二値扱いたかったりする。&lt;/a&gt;&lt;p&gt;
&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/rti/archive/2009/07/27/179358.aspx"&gt;Enum で bool 型を使いたい時って？&lt;/a&gt; (R.Tanaka.Ichiro's Blog)&lt;p&gt;
&lt;p&gt;前回の記事があまりにひどいできだったので、やり直します。&lt;/p&gt;
&lt;h3&gt;戻り値はtrue/falseでいいですか？&lt;/h3&gt;
&lt;p&gt;たとえば、データの書き込み関数「&lt;code&gt;TryWritingBytes&lt;/code&gt;」を考えます。バッファリングやハードウェアの都合上、書き込みには失敗する可能性があります。&lt;/p&gt;
&lt;p&gt;以下に、&lt;code&gt;TryWritingBytes&lt;/code&gt;関数の使用例を示します。同関数の実装は省略。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;extern bool TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size)) {
		// 成功時の処理
	} else {
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;この&lt;code&gt;TryWritingBytes&lt;/code&gt;の戻り値は、書き込み成功時に&lt;code&gt;true&lt;/code&gt;を返す仕様になります。が、こういう「成功=Trueだな」みたいに、経験十分プログラマ的な感覚で決められた関数って、危ういと思います。みんながみんな経験十分プログラマとは限らないからです。&lt;/p&gt;
&lt;h3&gt;成功不成功という値を作るべし。&lt;/h3&gt;
&lt;p&gt;そんなわけで、trueがどっちを表すかなんて、不毛な議論やコメントを書くくらいなら、さっさと別の二値型を作って、読む人も書く人も間違えないようにすべきです。&lt;/p&gt;
&lt;p&gt;そんなこんなで、このコード：&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;enum IsSuccess : bool {
	Success,
	Failed
};

extern IsSuccess TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size) == Success) {
		// 成功時の処理
	} else {	// Failed
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;こんな言語仕様あった方がいいと思いません？&lt;/p&gt;
&lt;h3&gt;補足&lt;/h3&gt;
&lt;p&gt;先の記事で、私、「true/falseを別名で扱いたいだけです」と書いていますが、考え直したところ、全然ダメです。true/falseを別名で扱うこともやはり手段であって、目的ではないですし、仮にできたとしても、所詮別名、成功不成功を表す別名にtrue/falseを代入できてしまいますから。&lt;/p&gt;
&lt;p&gt;なので、やっぱり、二値Enum。&lt;/p&gt;
&lt;p&gt;また先の記事のコメントやトラックバックで、いくつか代替方法をいただきましたが、やはり私を含む経験不足プログラマが見てもわかりやすい方式（二値Enumに限らず）が言語仕様に組み込まれる方が良いと思います。&lt;/p&gt;
&lt;p&gt;ちなみに、別に今回の二値Enumがベストな解だとは思っていません。&lt;/p&gt;
&lt;p&gt;あとあと、最後に。他にも言語仕様に不満ってありません？　っていうか何でテキストエディタなんだよ？　とか。クラスのメソッドを編集するのに、どのファイルを開けばいいかなんて、覚えるのなんて意味ないよ？　とか。もっと自由にやらせろ、的な。&lt;/p&gt;

&lt;h3&gt;追記＠2009-07-30T23:40&lt;/h3&gt;
&lt;p&gt;Success/False以外の例をいくつか。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;
enum OpenClose : bool { Open, Close };
OpenClose CheckOpenClose();
OpenClose OpenTray();

enum YesNo : bool { Yes, No };
YesNo CheckResponse();
YesNo WaitResponse();

enum GoodBad : bool { Good, Bad };
GoodBad CheckFile(const char * file_name);

enum MaleFemale : bool { Male, Female };
MaleFemale CheckSexuality();
&lt;/pre&gt;
&lt;p&gt;などなど&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/179566.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] タグ名と同じ名前にtypedefしちゃう。</title><link>http://blogs.wankuma.com/hirase/archive/2009/06/18/175851.aspx</link><pubDate>Thu, 18 Jun 2009 11:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/06/18/175851.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/175851.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/06/18/175851.aspx#Feedback</comments><slash:comments>178</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/175851.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/175851.aspx</trackback:ping><description>&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;typedef int int;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;error C2632: 'int' と 'int' の 2 つの型指定子のあいだにコードがありません。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;うん、そうだよねぇ。そりゃ、そうだ。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;
typedef enum Saga Saga;

enum Saga {
	OMOTE,
	URA,
};

typedef struct Ningen
{
	Saga saga;
} Ningen;
&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;えぇ・・・！ いいのぅ？&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/175851.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] fread/feof</title><link>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx</link><pubDate>Thu, 18 Sep 2008 00:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/156857.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/156857.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/156857.aspx</trackback:ping><description>&lt;p&gt;師走のような8月が過ぎましたので、再開。&lt;/p&gt;
&lt;p&gt;fopen直後のfreadで、引数に指定するサイズ（要素サイズとその個数の積が）が、ちょうどファイルサイズに一致しているとき、freadを呼んだ後の feofの戻り値として、正しいものはどれか？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;==0&lt;/li&gt;
&lt;li&gt;!=0&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;サンプル&lt;/h3&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    FILE* fp = fopen("10byte.dat", "rb");
    char buf[10];
    fread(buf, sizeof(char), sizeof(buf)/sizeof(char), fp);
    printf("%d\n", feof(fp));

    return 0;
}
&lt;/pre&gt;

&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/156857.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/C#] インタフェースっていったい・・・？</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx</link><pubDate>Mon, 14 Jul 2008 22:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/148849.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/148849.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/148849.aspx</trackback:ping><description>&lt;h4&gt;C++0xのコンセプトの話&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/faith_and_brave/"&gt;アキラさん&lt;/a&gt;のC++0xの資料を拝見して、コンセプトって、なんでインタフェースっていう名前にならなかったのか疑問に思ったのは自分だけ？&lt;/p&gt;
&lt;p&gt;だって、インタフェースと機能は同じで、しばりが少ないってだけな印象なのに。。同じダックタイピングなのに。&lt;/p&gt;
&lt;p&gt;いうなれば、コンセプトがインタフェースらしく振舞うのであれば、それは最早インタフェースだと思う。&lt;/p&gt;
&lt;h4&gt;C#のインタフェースの話&lt;/h4&gt;
&lt;p&gt;なんで継承/実装していないとキャストできないのか不思議。明示的に継承していない場合でも、関係なしにダウンキャストできていいと思うのですが。。&lt;/p&gt;
&lt;p&gt;こんな感じ↓&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;
using System;
interface IMyMeMine
{
    void Hello();
}

class SayHello
{
    public void Hello() { Console.WriteLine("Hello"); }
}

class Program
{
    static void Main(String[] args)
    {
        Hello(new SayHello());
    }

    static void Hello&amp;lt;T&amp;gt;(T t) where T:IMyMeMine
    {
        t.Hello();
    }
}
&lt;/pre&gt;
&lt;p&gt;たとえばシステムのクラスをジェネリックに扱いたい場合に、ときどきやりたい。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/148849.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>