<?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>プログラミング</title><link>http://blogs.wankuma.com/andochin/category/1659.aspx</link><description>プログラミングのよもやま</description><managingEditor>あんどちん</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>あんどちん</dc:creator><title>[C] const/非const初期値なしグローバル変数の扱い</title><link>http://blogs.wankuma.com/andochin/archive/2008/09/02/155065.aspx</link><pubDate>Tue, 02 Sep 2008 00:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/09/02/155065.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/155065.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/09/02/155065.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/155065.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/155065.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://bbs.wankuma.com/index.cgi?mode=al2&amp;amp;namber=24281"&gt;元ネタ&lt;/a&gt;&lt;/p&gt; &lt;p&gt;確認環境はVS2008&lt;/p&gt; &lt;p&gt;以下の2つのプログラム&lt;/p&gt; &lt;p&gt;test1.c&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;int hoge; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;int main(void) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%d\n", hoge); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;test2.c&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;const int hoge = 1;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;を&lt;/p&gt; &lt;p&gt;cl test1.c test2.c&lt;/p&gt; &lt;p&gt;して&lt;/p&gt; &lt;p&gt;test1&lt;/p&gt; &lt;p&gt;とすると出力結果は&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="4"&gt;1&lt;/font&gt;&lt;/p&gt; &lt;p&gt;cl test1.c test2.c /Faしてアセンブラのhogeの部分の出力を見ると&lt;/p&gt; &lt;p&gt;test1.asm&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;_DATA&amp;nbsp;&amp;nbsp;&amp;nbsp; SEGMENT&lt;br&gt;COMM&amp;nbsp;&amp;nbsp;&amp;nbsp; _hoge:DWORD&lt;br&gt;_DATA&amp;nbsp;&amp;nbsp;&amp;nbsp; ENDS&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;test2.asm&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="400"&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;PUBLIC&amp;nbsp;&amp;nbsp;&amp;nbsp; _hoge&lt;br&gt;CONST&amp;nbsp;&amp;nbsp;&amp;nbsp; SEGMENT&lt;br&gt;_hoge&amp;nbsp;&amp;nbsp;&amp;nbsp; DD&amp;nbsp;&amp;nbsp;&amp;nbsp; 01H&lt;br&gt;CONST&amp;nbsp;&amp;nbsp;&amp;nbsp; ENDS&lt;br&gt;END&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;因みにtest1.cの宣言をconst int hoge=1;にすると、test1.asmもtest2.asmと同様の出力になるため&lt;/p&gt; &lt;p&gt;fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。&lt;/p&gt; &lt;p&gt;が出る。&lt;/p&gt; &lt;p&gt;これでいいのだろうか？？？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/155065.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>templateの特殊化と型の切り替え</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/28/154481.aspx</link><pubDate>Thu, 28 Aug 2008 00:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/28/154481.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/154481.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/28/154481.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/154481.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/154481.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://bbs.wankuma.com/index.cgi?mode=al2&amp;amp;namber=24045"&gt;元ネタ&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;仕事ではCばっかだし、最近C++ってあんまり触ってないなぁ。boost::call_traitsのソースを見たので横浜に向けてお勉強。&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="816" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="814"&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;typeinfo&amp;gt;&lt;br&gt;#include &amp;lt;string&amp;gt;&lt;br&gt;#include &amp;lt;vector&amp;gt;&lt;br&gt;using namespace std; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" color="#ff0000" size="1"&gt;//&lt;br&gt;// 渡された型のサイズで値と参照を切り替える&lt;br&gt;//&lt;br&gt;template&amp;lt;typename T, bool sw&amp;gt; struct type_switcher_helper { typedef const T type; };&lt;br&gt;template&amp;lt;typename T&amp;gt; struct type_switcher_helper&amp;lt;T, false&amp;gt; { typedef const T&amp;amp; type; };&lt;br&gt;template&amp;lt;typename T&amp;gt; struct type_switcher {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef typename type_switcher_helper&amp;lt;T, sizeof(T) &amp;lt;= sizeof(void*)&amp;gt;::type type;&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;//&lt;br&gt;// 型名を取得する&lt;br&gt;// 参照は値と判別できない名前を返すので特殊化する&lt;br&gt;//&lt;br&gt;template&amp;lt;typename T&amp;gt; struct get_type { static string name() { return string(typeid(T).name()); }};&lt;br&gt;template&amp;lt;typename T&amp;gt; struct get_type&amp;lt;T&amp;amp;&amp;gt; { static string name() { return string(typeid(T).name()) + string("&amp;amp;"); }};&lt;br&gt;//&lt;br&gt;template&amp;lt;typename T&amp;gt; void print_type_name() { cout &amp;lt;&amp;lt; get_type&amp;lt;T&amp;gt;::name() &amp;lt;&amp;lt; endl; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;//&lt;br&gt;// ポインタ判定&lt;br&gt;//&lt;br&gt;char is_pointer_helper(bool, const void* p);&lt;br&gt;int&amp;nbsp; is_pointer_helper(bool, ...); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;// 関数によるポインタ判定&lt;br&gt;template&amp;lt;typename T&amp;gt; bool is_pointer_func(T a)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sizeof(is_pointer_helper(true, a)) == sizeof(char);&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;template&amp;lt;typename T&amp;gt; struct is_pointer_st { enum { Kind = 0 }; };&lt;br&gt;template&amp;lt;typename T&amp;gt; struct is_pointer_st&amp;lt;T*&amp;gt; { enum { Kind = 1 }; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;template&amp;lt;typename T&amp;gt; struct is_pointer_st&amp;lt;T* const&amp;gt; { enum { Kind = 1 }; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;int main()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "--- Type name&amp;nbsp; ---" &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;int&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;int*&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;int&amp;amp;&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;const int*&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;volatile int*&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt;();&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ここがcall_traits::param_typeと同じ事してるとこ&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;type_switcher&amp;lt;int&amp;gt;::type &amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_type_name&amp;lt;type_switcher&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt;::type &amp;gt;(); &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;amp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = a; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "--- Type check by function ---" &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_func(a) ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_func(&amp;amp;a) ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_func(b) ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_func(&amp;amp;b) ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "--- Type check by struct ---" &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_st&amp;lt;int&amp;gt;::Kind ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_st&amp;lt;int*&amp;gt;::Kind ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; (const char*) (is_pointer_st&amp;lt;int&amp;amp;&amp;gt;::Kind ? "Pointer" : "Not pointer") &amp;lt;&amp;lt; endl; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;出力結果は以下のとおり。&lt;/p&gt; &lt;p&gt;VS2008&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" color="#004080" size="1"&gt;&lt;strong&gt;--- Type name ---&lt;br&gt;int&lt;br&gt;int *&lt;br&gt;int&amp;amp;&lt;br&gt;int const *&lt;br&gt;int volatile *&lt;br&gt;class std::vector&amp;lt;int,class std::allocator&amp;lt;int&amp;gt; &amp;gt;&lt;br&gt;int&lt;br&gt;class std::vector&amp;lt;int,class std::allocator&amp;lt;int&amp;gt; &amp;gt;&amp;amp; &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" color="#004080" size="1"&gt;&lt;strong&gt;--- Type check by function ---&lt;br&gt;Not pointer&lt;br&gt;Pointer&lt;br&gt;Not pointer&lt;br&gt;Pointer &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" color="#004080" size="1"&gt;&lt;strong&gt;--- Type check by struct ---&lt;br&gt;Not pointer&lt;br&gt;Pointer&lt;br&gt;Not pointer&lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Cygwin+GCC3.4.4&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" color="#008000" size="1"&gt;&lt;strong&gt;--- Type name ---&lt;br&gt;i&lt;br&gt;Pi&lt;br&gt;i&amp;amp;&lt;br&gt;PKi&lt;br&gt;PVi&lt;br&gt;St6vectorIiSaIiEE&lt;br&gt;i&lt;br&gt;St6vectorIiSaIiEE&amp;amp; &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" color="#008000" size="1"&gt;&lt;strong&gt;--- Type check by function ---&lt;br&gt;Not pointer&lt;br&gt;Pointer&lt;br&gt;Not pointer&lt;br&gt;Pointer &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" color="#008000" size="1"&gt;&lt;strong&gt;--- Type check by struct ---&lt;br&gt;Not pointer&lt;br&gt;Pointer&lt;br&gt;Not pointer&lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;VS2008のtypeid().nameの名前に感動。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;これだけだと問題があって、long longやdoubleのようなvoid*よりも大きいサイズの型だと組込型でも参照になっちゃう。&lt;/p&gt; &lt;p&gt;call_traitsのソースを見ると、その辺も考慮してもっときちんと書いてあるけど、これくらいのプログラムでも知りたいこと知れたからこれ以上追及はしない（ってかできないです）。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/154481.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>C#とプリプロセッサー</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/15/153173.aspx</link><pubDate>Fri, 15 Aug 2008 23:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/15/153173.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/153173.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/15/153173.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/153173.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/153173.aspx</trackback:ping><description>&lt;p&gt; C#にはプリプロが無いからという話を聞くけど、普段C/C++を使っている身からすると無いのは不便。&lt;/p&gt; &lt;p&gt;こういうことはしちゃいけないんだろうか？ &lt;/p&gt; &lt;p align="center"&gt;&lt;font color="#ff0000" size="3"&gt;&lt;strong&gt;hello.cs&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; &lt;hr&gt;  &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;using System; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;#define HELLO "Hello, world!" &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;namespace Hello&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class SayHello&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Main(string[] args)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(HELLO);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;hr&gt;  &lt;p&gt; このプログラムをC/C++のコンパイラのプリプロセッサでプリプロセスし、C#のコンパイラでコンパイルすればC/C++と同様にプリプロセッサの恩恵を受けることが出来る。&lt;/p&gt; &lt;p&gt;つまり、&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="2"&gt;&lt;strong&gt;&lt;em&gt;cl /EP hello.cs &amp;gt; hellow.cs&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="2"&gt;&lt;strong&gt;&lt;em&gt;csc hellow.cs&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;とコンパイルし実行すれば&lt;/p&gt; &lt;p&gt;&lt;font color="#0080c0"&gt;&lt;em&gt;Hello, world!&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;と出力される。この方法は勿論Javaでも使用することが出来る。&lt;/p&gt; &lt;p&gt;このような事をしてはいけないんだろうか？&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="1"&gt;仕事ではダメと言われそうだけどw&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/153173.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>Javaでセクタリード</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/12/152814.aspx</link><pubDate>Tue, 12 Aug 2008 22:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/12/152814.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/152814.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/12/152814.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/152814.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/152814.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/andochin/archive/2008/03/27/130095.aspx"&gt;C&lt;/A&gt;/&lt;A href="http://blogs.wankuma.com/andochin/archive/2008/08/08/152221.aspx"&gt;C#&lt;/A&gt;でやってみたから今度はJavaで。 &lt;/P&gt;
&lt;P&gt;まず、読みだして1セクタ分の読み出しデータを表示するプログラムを作成。&lt;/P&gt;
&lt;P align=center&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;SectorRead.java &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;public class SectorRead {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.loadLibrary("SectorRead");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public native int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenDrive(int driveNumber);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public native byte[] ReadSector(int handle, int sector, int count);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public native void&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseDrive(int handle); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead sr = new SectorRead();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int h = sr.OpenDrive(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] data = sr.ReadSector(h, 0, 1); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; 512; i++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.format("%02x ", data[i]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(i % 16 == 15) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.print("\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr.CloseDrive(h);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;} &lt;/FONT&gt;
&lt;HR&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;上記Javaのソースコードを&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000 size=2&gt;javah -jni SectorRead.java&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;として下記SectorRead.hを作成する。&lt;/P&gt;
&lt;P align=center&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;SectorRead.h &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/* DO NOT EDIT THIS FILE - it is machine generated */&lt;BR&gt;#include &lt;JNI.H&gt;&lt;BR&gt;/* Header for class SectorRead */ &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;#ifndef _Included_SectorRead&lt;BR&gt;#define _Included_SectorRead&lt;BR&gt;#ifdef __cplusplus&lt;BR&gt;extern "C" {&lt;BR&gt;#endif&lt;BR&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenDrive&lt;BR&gt;* Signature: (I)I&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT jint JNICALL Java_SectorRead_OpenDrive&lt;BR&gt;&amp;nbsp; (JNIEnv *, jobject, jint); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadSector&lt;BR&gt;* Signature: (III)[B&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT jbyteArray JNICALL Java_SectorRead_ReadSector&lt;BR&gt;&amp;nbsp; (JNIEnv *, jobject, jint, jint, jint); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseDrive&lt;BR&gt;* Signature: (I)V&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT void JNICALL Java_SectorRead_CloseDrive&lt;BR&gt;&amp;nbsp; (JNIEnv *, jobject, jint); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;#ifdef __cplusplus&lt;BR&gt;}&lt;BR&gt;#endif&lt;BR&gt;#endif&lt;/FONT&gt; 
&lt;P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;上記ヘッダを基に実装作成。&lt;/P&gt;
&lt;P align=center&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;SectorRead.cpp &lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;#include &lt;WINDOWS.H&gt;&lt;BR&gt;#include &lt;CSTDIO&gt;&lt;BR&gt;#include &lt;STRSTREAM&gt;&lt;BR&gt;#include &lt;IOSTREAM&gt;&lt;BR&gt;#include "SectorRead.h" &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenDrive&lt;BR&gt;* Signature: (I)I&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT jint JNICALL Java_SectorRead_OpenDrive(JNIEnv * env, jobject obj, jint drive_number)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::strstream strs;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strs &amp;lt;&amp;lt; "\\\\.\\PHYSICALDRIVE" &amp;lt;&amp;lt; drive_number &amp;lt;&amp;lt; std::ends; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE h = CreateFile(strs.str(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GENERIC_READ,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_SHARE_READ | FILE_SHARE_WRITE,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN_EXISTING,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_ATTRIBUTE_NORMAL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return reinterpret_cast&amp;lt;jint&amp;gt;&lt;JINT&gt;(h);&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadSector&lt;BR&gt;* Signature: (II)[B&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT jbyteArray JNICALL Java_SectorRead_ReadSector(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JNIEnv * env,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jobject obj,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jint handle,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jint sector,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jint count)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size = count * 0x200;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jbyteArray&amp;nbsp;&amp;nbsp;&amp;nbsp; buff = env-&amp;gt;NewByteArray(size);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; jbyte*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buff_ptr = env-&amp;gt;GetByteArrayElements(buff, NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!buff_ptr) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE hFile = reinterpret_cast&amp;lt;HANDLE&amp;gt;&lt;HANDLE&gt;(handle);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp; read_size = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadFile(hFile, buff_ptr, size, &amp;amp;read_size, NULL); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; env-&amp;gt;ReleaseByteArrayElements(buff, buff_ptr, 0); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buff;&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=1&gt;/*&lt;BR&gt;* Class:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead&lt;BR&gt;* Method:&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseDrive&lt;BR&gt;* Signature: (I)V&lt;BR&gt;*/&lt;BR&gt;JNIEXPORT void JNICALL Java_SectorRead_CloseDrive(JNIEnv * env, jobject obj, jint handle)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle(reinterpret_cast&amp;lt;HANDLE&amp;gt;&lt;HANDLE&gt;(handle));&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;このソースを下記のようにコンパイルしDLL作成。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000 size=2&gt;&lt;STRONG&gt;&lt;EM&gt;cl /LD /EHsc /I"c:\Program Files\Java\jdk1.5.0_16\include" /I"c:\Program Files\Java\jdk1.5.0_16\include\win32" SectorRead.cpp&lt;/EM&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000 size=1&gt;&lt;STRONG&gt;※インクルードパスは環境に応じて設定&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;下記のようにして実行&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000 size=2&gt;java SectorRead&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT face="Courier New" color=#ff8000 size=1&gt;
&lt;P&gt;
&lt;P align=center&gt;&lt;FONT color=#0000ff size=4&gt;&lt;STRONG&gt;実行結果&lt;/STRONG&gt;&lt;/FONT&gt; 
&lt;HR&gt;
&lt;FONT color=#000000&gt;33 c0 8e d0 bc 00 7c 8e c0 8e d8 be 00 7c bf 00&lt;BR&gt;06 b9 00 02 fc f3 a4 50 68 1c 06 cb fb b9 04 00&lt;BR&gt;bd be 07 80 7e 00 00 7c 0b 0f 85 10 01 83 c5 10&lt;BR&gt;e2 f1 cd 18 88 56 00 55 c6 46 11 05 c6 46 10 00&lt;BR&gt;b4 41 bb aa 55 cd 13 5d 72 0f 81 fb 55 aa 75 09&lt;BR&gt;f7 c1 01 00 74 03 fe 46 10 66 60 80 7e 10 00 74&lt;BR&gt;26 66 68 00 00 00 00 66 ff 76 08 68 00 00 68 00&lt;BR&gt;7c 68 01 00 68 10 00 b4 42 8a 56 00 8b f4 cd 13&lt;BR&gt;9f 83 c4 10 9e eb 14 b8 01 02 bb 00 7c 8a 56 00&lt;BR&gt;8a 76 01 8a 4e 02 8a 6e 03 cd 13 66 61 73 1e fe&lt;BR&gt;4e 11 0f 85 0c 00 80 7e 00 80 0f 84 8a 00 b2 80&lt;BR&gt;eb 82 55 32 e4 8a 56 00 cd 13 5d eb 9c 81 3e fe&lt;BR&gt;7d 55 aa 75 6e ff 76 00 e8 8a 00 0f 85 15 00 b0&lt;BR&gt;d1 e6 64 e8 7f 00 b0 df e6 60 e8 78 00 b0 ff e6&lt;BR&gt;64 e8 71 00 b8 00 bb cd 1a 66 23 c0 75 3b 66 81&lt;BR&gt;fb 54 43 50 41 75 32 81 f9 02 01 72 2c 66 68 07&lt;BR&gt;bb 00 00 66 68 00 02 00 00 66 68 08 00 00 00 66&lt;BR&gt;53 66 53 66 55 66 68 00 00 00 00 66 68 00 7c 00&lt;BR&gt;00 66 61 68 00 00 07 cd 1a 5a 32 f6 ea 00 7c 00&lt;BR&gt;00 cd 18 a0 b7 07 eb 08 a0 b6 07 eb 03 a0 b5 07&lt;BR&gt;32 e4 05 00 07 8b f0 ac 3c 00 74 fc bb 07 00 b4&lt;BR&gt;0e cd 10 eb f2 2b c9 e4 64 eb 00 24 02 e0 f8 24&lt;BR&gt;02 c3 49 6e 76 61 6c 69 64 20 70 61 72 74 69 74&lt;BR&gt;69 6f 6e 20 74 61 62 6c 65 00 45 72 72 6f 72 20&lt;BR&gt;6c 6f 61 64 69 6e 67 20 6f 70 65 72 61 74 69 6e&lt;BR&gt;67 20 73 79 73 74 65 6d 00 4d 69 73 73 69 6e 67&lt;BR&gt;20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65&lt;BR&gt;6d 00 00 00 00 62 7a 99 87 65 74 ff 00 00 80 20&lt;BR&gt;21 00 07 fe ff ff 00 08 00 00 00 d8 42 25 00 00&lt;BR&gt;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;BR&gt;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;BR&gt;00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#ff8000 size=1&gt; 
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;使い道ねぇ～&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/152814.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>C#でセクタリード</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/08/152221.aspx</link><pubDate>Fri, 08 Aug 2008 00:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/08/152221.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/152221.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/08/152221.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/152221.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/152221.aspx</trackback:ping><description>&lt;p&gt;最初に言い訳。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;C#ではコンソールにHello, World!を出したことがある程度の知識です。間違ってたら指摘してください。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;とある掲示板でC#でHDDのセクタリードをするとは？という質問が出ていたのを見たので気になってやってみた。&lt;/p&gt; &lt;p&gt;ほぼ&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/03/27/130095.aspx"&gt;ここ&lt;/a&gt;でやったことのC#版。ただし、MBRを読んでパーティションテーブルを取得した後パーティション1の先頭セクタを読んでいる。&lt;/p&gt; &lt;p&gt; &lt;hr&gt; &lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;using System;&lt;br&gt;using System.Collections.Generic;&lt;br&gt;using System.Text;&lt;br&gt;using System.IO;&lt;br&gt;using System.Runtime.InteropServices; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;namespace SectorReadSample&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class SectorRead&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("Kernel32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern System.IntPtr CreateFile(System.Text.StringBuilder lpFileName,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint dwDesiredAccess,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint dwSharedMode,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr lpSecuriteAttributes,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint dwCreationDisposition,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint dwFlagsAndAttributes,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr hTemplateFile);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("Kernel32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsafe public static extern bool ReadFile(System.IntPtr hFile,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte* lpBuffer,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint nNumberOfBytesToRead,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint* lpNumberOfBytesRead,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr lpOverlapped);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("Kernel32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsafe public static extern uint SetFilePointer(System.IntPtr hFile,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint lDistanceToMove,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint* lpDistanceToMoveHigh,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint dwMoveMethod); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("Kernel32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern bool CloseHandle(System.IntPtr hFile); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StructLayout(LayoutKind.Sequential, Pack = 1)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsafe public struct PartitionTable&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public byte boot_flag;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ブートフラグ&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public fixed byte start_chs[3]; // 開始CHS&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public byte type;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // パーティションの種類&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public fixed byte end_chs[3];&amp;nbsp;&amp;nbsp; // 終了CHS&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public uint start_lba;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 開始LBA&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public uint total_sector;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // セクタ数&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* SetFilePointer用 */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const uint FileBegin = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const uint FileCurrent = 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const uint FileEnd = 2; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* デバイス名 */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private System.Text.StringBuilder deviceName;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* ハンドル */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private System.IntPtr hFile; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* コンストラクタ */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SectorRead(string dn)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deviceName = new System.Text.StringBuilder(dn);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hFile = CreateFile(deviceName,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x80000000,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // GENERIC_READ&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00000001 | 0x00000002, // FILE_SHARE_READ | FILE_SHARE_WRITE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr.Zero,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NULL&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // OPEN_EXISTING&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00000080,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FILE_ATTRIBUTE_NORMAL&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr.Zero);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NULL&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* デストラクタ */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~SectorRead()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle(hFile);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* セクタリード */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsafe public void ReadSector(uint sector, byte[] buff)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint len = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fixed(byte* p = &amp;amp;buff[0])&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetFilePointer(hFile, sector * 0x200, &amp;amp;len, FileBegin);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadFile(hFile, p, 0x200, &amp;amp;len, IntPtr.Zero);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* パーティションテーブル情報取得 MBR(セクタ0)を渡す */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsafe public PartitionTable ReadPartitionTable(byte[] buff, int part)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PartitionTable result = new PartitionTable();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fixed(byte* p = &amp;amp;buff[446]) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = ((PartitionTable*)p)[part];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] buff = new byte[512];&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1セクタ分のバッファ&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Cドライブをオープン&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead sr = new SectorRead("\\\\.\\PHYSICALDRIVE0");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 先頭セクタ(MBR)を読み出す。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr.ReadSector(0, buff);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // パーティション1の情報を取得&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SectorRead.PartitionTable p1 = sr.ReadPartitionTable(buff, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // パーティション1の先頭1セクタを読み出す&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr.ReadSector(p1.start_lba, buff); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* パーティション1セクタ情報 */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Partition Type:{0}", p1.type);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Start LBA:{0}", p1.start_lba);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Total Sector:{0}", p1.total_sector);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Partition1: {0:X2} {1:X2} {2:X2} {3:X2} {4:X2} {5:X2} {6:X2}",&lt;br&gt;&lt;/font&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buff[0], buff[1], buff[2], buff[3], buff[4], buff[5], buff[6]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/font&gt;&lt;/p&gt; &lt;p&gt; &lt;hr&gt; &lt;/p&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&lt;strong&gt;実行結果&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Partition Type:7 (NTFSは7)&lt;br&gt;Start LBA:2048 (先頭セクタ)&lt;br&gt;Total Sector:625137664(総セクタ数 ・1K=1000換算で約320GB)&lt;br&gt;Partition1: EB 52 90 4E 54 46 53 (文字にすると.R.NTFS)&lt;/font&gt; &lt;p&gt;どうやら正しくパーティションが読めているようです。&lt;/p&gt; &lt;p&gt;C#ならC++より簡単に作れると思ったけど、この手のことをするにはC++の方が楽みたい。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/152221.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>わんくま名古屋#3アンケート結果</title><link>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx</link><pubDate>Fri, 01 Aug 2008 21:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/151460.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/08/01/151460.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/151460.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/151460.aspx</trackback:ping><description>&lt;p&gt;&lt;em&gt;Q1.セッションの内容は期待通りでしたか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166.7&lt;br&gt;Q2.セッションの内容は理解できましたか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88.9&lt;br&gt;Q3.このセッションを知り合いなどに伝えたいと思いますか&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 122.2&lt;br&gt;組み込みはなじみがないので理解しづらかった。&lt;br&gt;C++のサイズでテンプレが来るかと思いましたが、ウマイなーと思いました。&lt;br&gt;堪能しました。&lt;br&gt;組み込みへのC++活用の説得材料にしたいと思います。&lt;br&gt;全体的には雰囲気として面白いと思います。&lt;br&gt;C++使いには、非常に興味ひかれる内容で楽しめました。&lt;br&gt;早口が聞き取りにくかったです、&lt;br&gt;興味深い組み込みの話でためになりました。&lt;br&gt;ぜんぜん知らない世界の説明を聞くのは楽しいので、またお願いします。&lt;br&gt;とりあえずCASTLE？勉強してみます。&lt;br&gt;画面の文字が小さすぎて、類推することもできませんでした。&lt;br&gt;途中からついていけなくなっちゃいました。ちょっと早口だったので、もう少しゆっくり話して頂けると、全くの素人でもついて行けたかも。きっと１時間でおさまらないくらいのボリュームの内容を話していただけたんだと思いました。ビデオみて勉強します。なんか組み込みってカッコいいかも！！&lt;br&gt;スルーされていたことが色々わからなかった所もありましたが、面白かったです。後半の満面の笑顔が忘れられませんｗ&lt;br&gt;バッサリやりすぎ&lt;br&gt;ZoomItとか拡大鏡の利用を検討しましょう。&lt;br&gt;biacさんのコマにつづいて予想外。&lt;br&gt;ぶった切り感も良かった。&lt;br&gt;サイズ一緒すごい&lt;br&gt;オブジェクト指向とり入れたソースコードでもコンパイル後のサイズがほとんど変わらない件について驚きました。組み込みは未経験ですが覚えておきたいと思います。&lt;/em&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;色々反省させられる内容になってしまいましたが、スピーカーをやったのはよい経験になりました。&lt;/p&gt; &lt;p&gt;思いの外C++ネタが好評のようで、そっちにフォーカス絞って話をした方がよかったのかもしれませんね。そうすれば仮想関数を使った場合の話なんかも織り込めたし。&lt;/p&gt; &lt;p&gt;C/C++で同じサイズになった理由は&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx"&gt;ここ&lt;/a&gt;に書いた通りです。今回は簡単な例で出しましたが、応用すればかなり使えるんじゃないかな？と思います。&lt;/p&gt; &lt;p&gt;因みにセッション後Nさんより「emacs使ってる変態」と言われ、T(C)さんからは「こんなキーボード(EeePC)でプログラムを書くなんてオカシイ」と突っ込まれましたw&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/151460.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>初スピーカーを終えて　～わんくま名古屋勉強会 #3補足～</title><link>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx</link><pubDate>Tue, 29 Jul 2008 00:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/150727.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/07/29/150727.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/150727.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/150727.aspx</trackback:ping><description>&lt;p&gt;10分で終わるだろうと思っていたセッション内容も予想を反して1時間も喋ってしまい後片付けを急がせる結果になってしまい申し訳なかったです。&lt;/p&gt; &lt;p&gt;中々思う通りにはいきませんね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;メインセッションで出したプログラムは&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/01/07/116335.aspx"&gt;ここ&lt;/a&gt;と&lt;a href="http://blogs.wankuma.com/andochin/archive/2008/01/09/116510.aspx"&gt;ここ&lt;/a&gt;の内容をもっと簡略化したものです。&lt;/p&gt; &lt;p&gt;ただ、僕個人の意見としては&lt;/p&gt; &lt;p&gt;「CPUがどうやって動くの？&lt;/p&gt; &lt;p&gt;とか&lt;/p&gt; &lt;p&gt;「CPUはこんな命令があるんだ」&lt;/p&gt; &lt;p&gt;ということを知っていれば良くて、必要性が無ければアセンブラを覚える必要は無いと思ってます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;そして、数名の方からご質問いただいた気持ち的なメインセッション。CとC++で同じサイズのコードが出た部分についての解説です。&lt;/p&gt; &lt;p&gt;以降使用しているコンパイラはgcc3.4.4でコンパイルオプションは-O2 -mh -mint32です。&lt;/p&gt; &lt;p&gt;前述とは裏腹にアセンブラのコードを出していますが、行数が多いってことは出力コードがデカくて遅い程度の認識で良いです。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;最初にCのプログラムです。&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="706" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="262"&gt; &lt;p align="center"&gt;C (元のプログラム)&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="442"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="260"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;typedef unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp; byte;&lt;br&gt;typedef unsigned short&amp;nbsp;&amp;nbsp;&amp;nbsp; word;&lt;br&gt;typedef unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp; dword; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;#define PADDR 0xffffd1&lt;br&gt;#define PADR&amp;nbsp; 0xffffd3&lt;br&gt;#define PBDDR 0xffffd4&lt;br&gt;#define PBDR&amp;nbsp; 0xffffd6 &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte data;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* paddr = (byte*) PADDR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* padr = (byte*) PADR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbddr = (byte*) PBDDR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbdr = (byte*) PBDR; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *padr = 0x00;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *paddr = 0x00; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = 0x00;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbddr = 0x0f; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = *padr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="442"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.c"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,r2l &lt;font color="#ff0000"&gt;&lt;strong&gt;// 0を作ってる&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777171:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *padr = 0x00;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777169:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *paddr=0x00;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *pbdr = 0x00;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777172:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// *pbddr = 0x0f;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;.L2: &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// while(1) {&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// 上の行と合わせて*pbdr = *padr;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L2 &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;// } &lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;これが元のCのプログラムです。元のソースが短いこともありいいコード出してくれてますね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;素直にクラス化してみます。DDRは最初に設定したらその後の書き換えはする必要がないので、コンストラクタのパラメータにして、データレジスタへの書き込みは*オペレータをオーバーロードしてクラスオブジェクトがポートであるように扱えるようにしてみます。&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="616" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="396"&gt; &lt;p align="center"&gt;C++&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="218"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="396"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;// 型定義とマクロ割愛&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;class pio {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* ddr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* dr;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio(dword ddr_val, dword dr_val, byte dir, byte init = 0) :&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ddr(reinterpret_cast&amp;lt;volatile byte*&amp;gt;(ddr_val)),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dr(reinterpret_cast&amp;lt;volatile byte*&amp;gt;(dr_val)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *dr = init;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ddr = dir;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte&amp;amp; operator *() { return *dr; }&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio pa(PADDR, PADR, 0x00);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio pb(PBDDR, PBDR, 0x0f); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pb = *pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="218"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.cpp"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; add.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #-16,er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,r3l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777169,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #2,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@(-4,er6)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@16777171:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @er0,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; subs&amp;nbsp;&amp;nbsp;&amp;nbsp; #4,er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777172,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@er0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adds&amp;nbsp;&amp;nbsp;&amp;nbsp; #2,er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er2,@(-12,er6)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @er0,er3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@er3&lt;br&gt;.L4:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @(-4,er6),er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @er2,r3l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; @(-12,er6),er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r3l,@er2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;コンストラクタ・オペレータの部分がインライン展開されているところはいいのですが、DR/DDRのアドレスをクラスメンバで持っており、それらのオブジェクトの初期化コード、及びDRのアクセスをする際にクラスメンバであるアドレスを一旦er2に入れてからアクセスしていることで長いコードになっています。&lt;/p&gt; &lt;p&gt;但し、このコードの場合最適化によってはCと同等のコードを出す可能性はあります。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;テンプレートを使ってCと同等なコードを出すように細工してみました。&lt;/p&gt; &lt;p&gt;&lt;font color="#c0c0c0" size="1"&gt;&lt;strong&gt;(中さんから「何回書き直しました？」と聞かれたとき「鋭い！」と思った)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="859" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="511"&gt; &lt;p align="center"&gt;C++&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="346"&gt; &lt;p align="center"&gt;アセンブラ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="511"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;// 型定義とマクロ割愛&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;struct input {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { VAL = 0 };&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;struct output {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { VAL = 1 };&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;template&amp;lt;dword DDR, dword DR,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d0 = input, typename d1 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d2 = input, typename d3 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d4 = input, typename d5 = input,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typename d6 = input, typename d7 = input&amp;gt;&lt;br&gt;class pio {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum { DIR = d7::VAL &amp;lt;&amp;lt; 7 | d6::VAL &amp;lt;&amp;lt; 6 | d5::VAL &amp;lt;&amp;lt; 5 | d4::VAL &amp;lt;&amp;lt; 4 |&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d3::VAL &amp;lt;&amp;lt; 3 | d2::VAL &amp;lt;&amp;lt; 2 | d1::VAL &amp;lt;&amp;lt; 1 | d0::VAL };&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio(byte init = 0) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DR)&amp;nbsp; = init;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DDR) = static_cast&amp;lt;byte&amp;gt;(DIR);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte&amp;amp; operator *() { return *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(DR); }&lt;br&gt;}; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio&amp;lt;PADDR, PADR&amp;gt; pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pio&amp;lt;PBDDR, PBDR, output, output, output, output&amp;gt; pb; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pb = *pa;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="346"&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .file&amp;nbsp;&amp;nbsp;&amp;nbsp; "main.cpp"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .h8300h&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section .text&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global _main&lt;br&gt;_main:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er6,@-er7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; er7,er6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777171:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777169:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; #15,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777172:8&lt;br&gt;.L4:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp;&amp;nbsp; .L4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ident&amp;nbsp;&amp;nbsp;&amp;nbsp; "GCC: (GNU) 3.4.4"&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;C++のコードは長くなってしまいましたが、利点はDDR初期設定値をinput/outputという型で指定できるので初期値がわかりやすくなること。&lt;/p&gt; &lt;p&gt;書いていて気付いたんですが、出力ビットのビット位置を指定するようにした方が良かったですね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;普段C++でtemplateを使っている方なら既に気付かれることと思いますが、見ての通りマクロに毛が生えた程度のコードです。&lt;/p&gt; &lt;p&gt;例えば&lt;/p&gt; &lt;p&gt;*pb=*pa;&lt;/p&gt; &lt;p&gt;の部分は&lt;/p&gt; &lt;p&gt;*reinterpret_cast&amp;lt;volatile byte*&amp;gt;(PBDR) = *reinterpret_cast&amp;lt;volatile byte*&amp;gt;(PADR);&lt;/p&gt; &lt;p&gt;と同じです。&lt;/p&gt; &lt;p&gt;つまり、&lt;/p&gt; &lt;p&gt;*((volatile byte*) PBDR) = *((volatile byte*) PADR);&lt;/p&gt; &lt;p&gt;と同じですね。&lt;/p&gt; &lt;p&gt;さて、元となっているCのソースでは変数宣言&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* padr = (byte*) PADR;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile byte* pbdr = (byte*) PBDR;  &lt;p&gt;をしているにも関わらず &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pbdr = *padr;&lt;br&gt;部分がレジスタやローカルフレームによる変数領域を使用せず&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; @16777171:8,r2l&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.b&amp;nbsp;&amp;nbsp;&amp;nbsp; r2l,@16777174:8&lt;br&gt;&lt;/p&gt; &lt;p&gt;と最適化されて出力されています。これはCで書けば&lt;/p&gt; &lt;p&gt;*((byte*) PBDR) = *((byte*) PADR);&lt;/p&gt; &lt;p&gt;になるわけですね。これは先ほどテンプレートを展開したコードと同等です。&lt;/p&gt; &lt;p&gt;C++のtemplate版の方は上記のとおり、変数を使用せずアドレスを指す整数値をポインタへキャストしてアクセスしていますから。&lt;/p&gt; &lt;p&gt;このような理由でCとC++のコードのコンパイル結果が同じものになっています。&lt;/p&gt; &lt;p&gt;もし、Cのソースの方のコンパイル結果が&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Tahoma" size="2"&gt;mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777171,er2&lt;br&gt;&lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov.l&amp;nbsp;&amp;nbsp;&amp;nbsp; #16777174,er3&lt;br&gt;.L2:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;mov.b&amp;nbsp;&amp;nbsp; @er2,@er3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bra&amp;nbsp;&amp;nbsp; .L2&lt;/p&gt;&lt;/font&gt; &lt;p&gt;となっていたら同等な結果は得られなかったかもしれません。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;# templateにはtemplateなりの問題もありますが、少々姑息と思いながらも今までC++は遅くなる、大きくなるからダメと言われてずーっとC++を使えなかったから、そのはけ口として出してしまいました^^;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="1"&gt;そして、どうしても言えなかったことですが、-O2付けないとtemplate版でもC++の方がデカくなりますw&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;そして、パワポ資料は&lt;a href="http://andochin.wankuma.com/benkyokai/wankuma_nagoya3.ppt"&gt;ここ&lt;/a&gt;&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/150727.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>C++ 0x</title><link>http://blogs.wankuma.com/andochin/archive/2008/07/13/148700.aspx</link><pubDate>Sun, 13 Jul 2008 20:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/07/13/148700.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/148700.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/07/13/148700.aspx#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/148700.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/148700.aspx</trackback:ping><description>&lt;p&gt;アキラさんのセッション面白かったです。&lt;/p&gt; &lt;p&gt;でもね、やっぱりね、&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#008000" size="6"&gt;覚えれば簡単に書けるようになります&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;ってのはどうも引っかかるんですね。&lt;/p&gt; &lt;p&gt;勿論、その追加された機能を覚えれば他の面倒臭い事を覚えなくて良いというなら大歓迎ですが、&lt;/p&gt; &lt;p&gt;新たに追加された機能によって簡単になる元の機能の知識があることが前提のような気がして…&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;とはいえ、C/C++は廃れて欲しくないからこれからも進化し続けることは大歓迎。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;templateとかサクっと書けない人（僕）でも簡単に使えるような言語になってくれることを期待してます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/148700.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>[c/c++]ソート祭りにのってみる</title><link>http://blogs.wankuma.com/andochin/archive/2008/07/09/148059.aspx</link><pubDate>Wed, 09 Jul 2008 00:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/07/09/148059.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/148059.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/07/09/148059.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/148059.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/148059.aspx</trackback:ping><description>&lt;p&gt;値の配列をソートするのではなく、昇順のインデックスリストを作る。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;iterator&amp;gt;&lt;br&gt;#include &amp;lt;algorithm&amp;gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;using namespace std; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;int val[10];&lt;br&gt;int idx[10];&lt;br&gt;int top; &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;void print_idx(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Top=%2d ", top);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; 10; i++) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("[%2d,%2d]", val[i], idx[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; putchar('\n');&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;int main(void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp; i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * ランダムな配列作成とインデックスリストの初期化&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; 10; i++) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val[i] = i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx[i] = -1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; random_shuffle(val, val+10); &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * ソート&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; top = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 1; i &amp;lt; 10; i++) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(val[top] &amp;gt; val[i]) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx[i] = top;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top = i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_idx();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int pos = top;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(idx[pos] != -1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(val[idx[pos]] &amp;gt; val[i]) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx[i] = idx[pos];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx[pos] = i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = idx[pos];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(idx[pos] == -1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx[pos] = i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_idx();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;/font&gt; &lt;p&gt;---------- &lt;p&gt;実行結果 &lt;p&gt;Top= 1 [ 8,-1][ 1, 0][ 9,-1][ 2,-1][ 0,-1][ 5,-1][ 7,-1][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 1 [ 8, 2][ 1, 0][ 9,-1][ 2,-1][ 0,-1][ 5,-1][ 7,-1][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 1 [ 8, 2][ 1, 3][ 9,-1][ 2, 0][ 0,-1][ 5,-1][ 7,-1][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 0][ 0, 1][ 5,-1][ 7,-1][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 5][ 0, 1][ 5, 0][ 7,-1][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 5][ 0, 1][ 5, 6][ 7, 0][ 3,-1][ 4,-1][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 7][ 0, 1][ 5, 6][ 7, 0][ 3, 5][ 4,-1][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 7][ 0, 1][ 5, 6][ 7, 0][ 3, 8][ 4, 5][ 6,-1]&lt;br&gt;Top= 4 [ 8, 2][ 1, 3][ 9,-1][ 2, 7][ 0, 1][ 5, 9][ 7, 0][ 3, 8][ 4, 5][ 6, 6] &lt;img src ="http://blogs.wankuma.com/andochin/aggbug/148059.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>リターンは一度だけ</title><link>http://blogs.wankuma.com/andochin/archive/2008/06/05/141793.aspx</link><pubDate>Thu, 05 Jun 2008 21:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2008/06/05/141793.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/141793.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2008/06/05/141793.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/141793.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/141793.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/ma2/archive/2008/06/05/141570.aspx"&gt;ここ&lt;/A&gt;とか&lt;A href="http://blogs.wankuma.com/izmktr/archive/2008/06/05/141772.aspx"&gt;ここ&lt;/A&gt;に触発されて3種類ほど書いてみた。&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2 width=762 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=760&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;#include &amp;lt;cstdio&amp;gt;&lt;BR&gt;#include &amp;lt;cstdlib&amp;gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;using namespace std; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;int test_val; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;bool test1(void) { printf("test1()\n"); return test_val &amp;gt; 1; }&lt;BR&gt;bool test2(void) { printf("test2()\n"); return test_val &amp;gt; 2; }&lt;BR&gt;bool test3(void) { printf("test3()\n"); return test_val &amp;gt; 3; }&lt;BR&gt;bool test4(void) { printf("test4()\n"); return test_val &amp;gt; 4; }&lt;BR&gt;bool test5(void) { printf("test5()\n"); return test_val &amp;gt; 5; }&lt;BR&gt;void test_ok(void) { printf("Test OK\n"); } &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;bool do_test1(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Test pattern 1\n"); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!test1()) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!test2()) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!test3()) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!test4()) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!test5()) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_ok();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while(0); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;bool do_test2(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool (*tests[])(void) = {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test3,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test4,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test5,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp; i;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = true; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Test pattern 2\n"); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; tests[i] != NULL &amp;amp;&amp;amp; result; i++) result = tests[i]();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(result) test_ok(); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;bool do_test3(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Test pattern 3\n"); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return test1() &amp;amp;&amp;amp; test2() &amp;amp;&amp;amp; test3() &amp;amp;&amp;amp; test4() &amp;amp;&amp;amp; test5() &amp;amp;&amp;amp; (test_ok(), true);&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;int main(int argc, const char* argv[])&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(argc &amp;lt; 3) return 0; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test_val = atoi(argv[2]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(atoi(argv[1])) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1: result = do_test1(); break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2: result = do_test2(); break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3: result = do_test3(); break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(result) printf("全テスト正常終了"); &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;}&lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;コンパイルして実行するときに&lt;/P&gt;
&lt;P&gt;[program name] テストパターン エラーを返す位置&lt;/P&gt;
&lt;P&gt;で3種類の挙動を見ることが出来ます（どれも同じだけど）&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ちょっとトリッキーなのはテストパターン３ですかね。1行で済んですっきり。&lt;/P&gt;
&lt;P&gt;C++で書いたのはboolを使いたかったから。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/141793.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>