<?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>[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>0</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>8</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><item><dc:creator>T.Hirase</dc:creator><title>[C++/CLI] アンマネージのコールバックにマネージのメソッドを登録する。</title><link>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</link><pubDate>Mon, 09 Jun 2008 21:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/142430.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/142430.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/142430.aspx</trackback:ping><description>&lt;p&gt;こんな方法は・・・・・・・&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;using namespace System;

#pragma unmanaged
// コールバック関数の型
typedef int (__stdcall *CallbackFuncType)(int, float);

// コールバック関数
static CallbackFuncType g_func;

// コールバック関数の登録
void SetCallback(CallbackFuncType f)
{
    g_func = f;
}

// コールバック関数の呼び出し。
int Run()
{
    return g_func(10, 0.5f);
}
#pragma managed

int __stdcall MyFunc(int i, float f)
{
    Console::WriteLine(i.ToString());
    return static_cast&amp;lt;int&amp;gt;(i * f);
}

int main(array&amp;lt;System::String ^&amp;gt; ^args)
{
    // Callback登録（マネージ関数を登録・・）
    SetCallback(MyFunc);

    // GCしても大丈夫かを確認（登録した関数ポインタがGCされる・・ない）
    GC::Collect(2, GCCollectionMode::Forced);

    // コールバックをネイティブ関数に呼び出してもらう（GCされてたら死亡）
    Int32 ret = Run();
    Console::WriteLine(ret.ToString());

    return 0;
}
&lt;/pre&gt;
&lt;p&gt;これって、どうなんだろう。実行は問題ないんだけど。。&lt;/p&gt;
&lt;p&gt;MSDN「&lt;a href="http://msdn.microsoft.com/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;」とは違う方法で、&lt;a href="http://msdn.microsoft.com/library/system.runtime.interopservices.marshal.getfunctionpointerfordelegate.aspx"&gt;Marshal::GetFunctionPointerForDelegate()&lt;/a&gt; も使わないんだけど・・・。&lt;/p&gt;
&lt;p&gt;何かご存じの方、、ヘルプミー。&lt;/p&gt;
&lt;h3&gt;See Also&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36275&amp;forum=7"&gt;[C#] デリゲートをGCの対象から外す方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-JP/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/367eeye0.aspx"&gt;How to: Marshal Callbacks and Delegates Using C++ Interop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/142430.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] wchar_tって・・・。</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx</link><pubDate>Tue, 27 May 2008 22:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/139688.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/139688.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/139688.aspx</trackback:ping><description>&lt;p&gt;VC2008で、ソースファイルのプロパティで&lt;br&gt;
「詳細」の「コンパイル言語の選択」を「Cコードとしてコンパイル (/TC)」として、&lt;br&gt;
「言語」の「wchar_t をビルトイン型として扱う (/Zc:wchar_t」を「はい」にすると、&lt;br&gt;
wchar_t が組み込み型として使えそうなのに、使えないんですね・・・。&lt;br&gt;
&lt;br&gt;
# wchar.hをincludeすれば使えますけど、unsigned short扱いだし、&lt;br&gt;
# CRTを使いたくないのに、wchar.h から crtdefs.h を読み込んじゃうし・・・&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
C で書くなと？？&lt;br&gt;
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/139688.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] シェーカーソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx</link><pubDate>Thu, 08 May 2008 02:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136788.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136788.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136788.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136788.aspx</trackback:ping><description>&lt;h2&gt;シェーカーソート（シェーカーソート、Shaker sort、カクテルソート、Cocktail sort、双方向バブルソート、bidirectional bubble sort）。&lt;/h2&gt;
&lt;p&gt;バブルソートの改良版。バブルソートで1回のループで昇順と降順を一度に並び替える。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template &amp;lt;typename TElement, typename TSize&amp;gt;
void ShakerSort(TElement * data, const TSize size)
{
    TSize head = 0;
    TSize tail = size - 1;
    while (head &amp;lt; tail)
    {
        TSize swapPos = head;

        for (TSize i = head; i &amp;lt; tail; ++i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }

        tail = swapPos;

        for (TSize i = tail; i &amp;gt; head; --i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }
        {    // TSizeがunsigned型の場合、対策。
            TSize i = head;
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapPos = i;
            }
        }
        head = swapPos;
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136788.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] ハトの巣ソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx</link><pubDate>Thu, 08 May 2008 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136781.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136781.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136781.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136781.aspx</trackback:ping><description>&lt;h2&gt;ハトの巣ソート（ピジョンソート、Pigeon sort）。&lt;/h2&gt;
&lt;p&gt;いまいち理解できていないので、Wikipedia様に丸投げ→→「&lt;a href="http://en.wikipedia.org/wiki/Pigeonhole_sort" target="_blank"&gt;Pigeonhole sort&lt;/a&gt;」。（ 18:06, 19 March 2008版には擬似コードもあり。）&lt;/p&gt;
&lt;p&gt;メモリは食うけど、ソートは馬鹿早い。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;p&gt;追記＠2008-05-12T23:39+09:00：新しいバージョンをアップ。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;/* データはユニークである必要があります。 */
template&amp;lt;typename TElement, typename TSize&amp;gt;
void PigeonholeSort(TElement * data, const TSize size)
{
    TElement min = data[0];
    TElement max = min;
    for (TSize i = 1; i &amp;lt; size; ++i) {
        min = data[i] &amp;lt; min ? data[i] : min;
        max = data[i] &amp;gt; max ? data[i] : max;
    }

    TSize range = max - min + 1;
    TElement * pigeonholes = new TElement[range];
    for (TSize i = 0; i &amp;lt; range; ++i)
        pigeonholes[i] = 0;	/* memsetで十分。 */

    for (TSize i = 0; i &amp;lt; size; ++i)
        pigeonholes[data[i]-min] = data[i];

    TSize dataPos = 0;
    for (TSize i = 0; i &amp;lt; range; ++i)
        if (pigeonholes[i] != 0)
            data[dataPos++] = i + min;

    delete[] pigeonholes;
}&lt;/pre&gt;
&lt;p&gt;追記@2008-05-08T17:19+09:00：下記のコードはちょっと間違えています。そのうち修正しますので、くれぐれも参考にしないよう、お願いします。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;map&amp;gt;
 
template&amp;lt;typename TElement, typename TSize&amp;gt;
void PigeonholeSort(TElement * data, const TSize size)
{
    typedef std::map&amp;lt;TElement, std::vector&amp;lt;TElement&amp;gt; &amp;gt; TMap;
    TMap pigeonholes;
    
    for (TSize i = 0; i &amp;lt; size; ++i)
        pigeonholes[data[i]].push_back(data[i]);
    
    TSize dataPos = 0;
    const TMap::const_iterator end = pigeonholes.end();
    for (TMap::iterator it = pigeonholes.begin(); it != end; ++it)
    {
        const TMap::value_type &amp; pigeonhole = *it;
        const TSize size =  pigeonhole.second.size();
        for (TSize i = 0; i &amp;lt; size; ++i)
        {
            data[dataPos++] = pigeonhole.first;
        }
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136781.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] 選択ソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx</link><pubDate>Thu, 08 May 2008 00:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136763.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/08/136763.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136763.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136763.aspx</trackback:ping><description>&lt;h2&gt;選択ソート（直接選択ソート、Selection sort）。&lt;/h2&gt;
&lt;p&gt;一番小さいのを選んで、先頭へ。次に小さいのを選んで2番目に・・・と並べる。一般的には、同じ要素の並びが変わってしまう不安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template&amp;lt;typename TElement, typename TSize&amp;gt;
void SelectionSort(TElement * data, const TSize size)
{
    TSize tail = size - 1;
    for (TSize head = 0; head &amp;lt; tail; ++head)
    {
        TElement * pMin = (data + head);
        for (TSize pos = head + 1; pos &amp;lt; size; ++pos)
            if (data[pos] &amp;lt; *pMin) pMin = (data + pos);
    
        if (data + head != pMin)
        {
            TElement temp = data[head];
            data[head] = *pMin;
            *pMin = temp;
        }
    }
}
&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136763.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] バブルソート</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx</link><pubDate>Wed, 07 May 2008 23:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/136743.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/07/136743.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/136743.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/136743.aspx</trackback:ping><description>&lt;h2&gt;バブルソート（Bubble sort）&lt;/h2&gt;
&lt;p&gt;2つの要素を比べては交換、比べては交換して、交換できる要素がなくなれば終了。同じ要素の並びは変わらない安定ソート。&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;template &amp;lt;typename TElement, typename TSize&amp;gt;
void BubbleSort(TElement * data, const TSize size)
{
    bool swapped = false;
    do
    {
        swapped = false;
        const TSize max = size - 1;
        for (TSize i = 0; i &amp;lt; max; ++i)
        {
            TElement diff = data[i] - data[i+1];
            if (diff &amp;gt; 0)
            {
                data[i  ] = data[i+1];
                data[i+1] = diff + data[i];
                swapped = true;
            }
        }
    } while (swapped);
}
&lt;/pre&gt;
&lt;p&gt;これでOK？&lt;/p&gt;
&lt;p&gt;交換するコードが、味噌味。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/136743.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>