忍者ブログ

どっかのゆとりのチラシの裏

plasma_effectのメモ帳的ブログのようなsomething

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コンパイル時マージソートの話

お前は何を言っているんだ感がすごい漂うが、コンパイル時に512要素のマージソートの話。C++11の規格でconstexprは再帰深度が云々って話なので再帰深度オーダーがO(N)だとダメなわけで。で、とりあえず整列済みの2つの配列をマージさせる関数を書いたわけですが。もうちょっとチューンしたらメモリ効率よくなるか知らないがそもそも上であるようにconstexprのステップ数上限に引っかかってるのでどうしようもなかったりする。ステップ数はどんな実装でも平等に増えていくし。

で、今回の記事はその「メモリ効率とかステップ数とか全てを無視して再帰深度のオーダーだけを考えた整列済みの2つの配列をマージする関数」の解説を書きたいとかいう話。
コード読みゃいいじゃねぇかって話な気がするがそれは気にしない気にしない。
PR

VS2013でコンパイルエラーの原因を追求する話

例えば以下のソースコードがある。

#include<boost/xpressive/xpressive.hpp>

int main()
{
    boost::xpressive::sregex hoge = "test" << boost::xpressive::_;
}




自明にダメなコードだが気づかなかったものとしてこれでビルドしてみる。
するとエラー一覧には以下の様なコンパイルエラーが出るはず。

error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : 引数1を'boost::mpl::failed************boost::xpressive::INVALID_REGULAR_EXPRESSION::* ***********'から'boost::mpl::assert<false>::type'へ変換できません。

非常につらい気持ちになる。何よりこのエラーの場所がbasic_regex.hppの117行目と出るのだから頭を抱える。
こういうtemplate特有の意味不明を極めたコンパイルエラーは非常につらみがあるのだがこういう時とりあえず出力を見てみる。

1>------ ビルド開始: プロジェクト:boost_test, 構成:Release Win32 ------
1>  main.cpp
1>C:\boost_1_55_0_32_bin\boost/xpressive/basic_regex.hpp(117): error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : 引数 1 を 'boost::mpl::failed ************boost::xpressive::INVALID_REGULAR_EXPRESSION::* ***********' から 'boost::mpl::assert<false>::type' へ変換できません。
1>          コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。
1>          main.cpp(5) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::xpressive::basic_regex<std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>>>::basic_regex<boost::proto::exprns_::expr<Tag,Args,2>>(const Expr &)' の参照を確認してください
1>          with
1>          [
1>              Tag=boost::proto::tagns_::tag::shift_left
1>  ,            Args=boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[5]>,0>,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::xpressive::detail::any_matcher>,0> &>
1>  ,            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[5]>,0>,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::xpressive::detail::any_matcher>,0> &>,2>
1>          ]
1>          main.cpp(5) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::xpressive::basic_regex<std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>>>::basic_regex<boost::proto::exprns_::expr<Tag,Args,2>>(const Expr &)' の参照を確認してください
1>          with
1>          [
1>              Tag=boost::proto::tagns_::tag::shift_left
1>  ,            Args=boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[5]>,0>,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::xpressive::detail::any_matcher>,0> &>
1>  ,            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[5]>,0>,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::xpressive::detail::any_matcher>,0> &>,2>
1>          ]
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

もっとつらい気持ちになるが、とりあえず上から見ていく。
標準ライブラリやboostにバグはないものとして(いやある可能性はあるのだがそれは置いておく)見ていくと次の文に目が止まるはず。

1>          main.cpp(5) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::xpressive::basic_regex<std::_String_const_iterator<std::_String_val<std::_Simple_types<char>>>>::basic_regex<boost::proto::exprns_::expr<Tag,Args,2>>(const Expr &)' の参照を確認してください

とりあえずmain.cpp(5)をチェックする。するとビットシフトの向きが逆になっていることに気づくはず。いやさすがにその場で気づかなくてもboostjpでのboost.xpressiveの使い方をチェックすればわかるはず。

今回の教訓。boost.xpressiveのシフト演算子の向きは間違えないようにしようtemplate絡みのコンパイルエラーは出力を確認しよう。

list maker

http://ux.getuploader.com/DYZ_Repository/download/3/list_maker.zip
みすりる氏のエニビ譜面リストを見て「譜面リストちゃちゃっと作れるマークアップ言語作ろう」とか思って作った。
現状五十音順ソートとレベル順ソートとスキルアナライザーっぽいのを出力するしか出来ない。
レベル別にページ変えるとか発狂難易度を別ページに作るとかもない。
書き方については付属のreference.txtとかexample.txtとか見て。
あと実行にはVS2013のランタイムが必要です。

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

フリーエリア

最新CM

[02/12 kariya_mitsuru]
[10/14 どっかの京大生o]
[10/04 どっかのZ会生y]
[07/31 どっかのZ会生y]
[07/31 GNR]

プロフィール

HN:
plasma_effect
性別:
非公開

バーコード

ブログ内検索

最古記事

(06/08)
(06/18)
(06/21)

P R