2013年11月25日月曜日

[Visual Studio] コードフォーマッタのスタイルを自分好みに変更する

Visual Studio Express 2013 for Windows Desktop を使ってみたのですが、
if と ( の間にスペースを自動挿入する設定になっていました。

if と ( はくっつけたい派なので、設定を変更してみました。

設定方法
  1. 「ツール」メニュー - 「オプション」を選択します。
  2. オプションダイアログから「テキストエディター」 - 「C/C++」 - 「書式設定」 - 「行間」を選択
  3. 「コントロールブロックのスペース」の「制御フローステートメント内のキーワードと始めかっこの間にスペースを挿入する」のチェックボックスからチェックを外す

これで if と ( の間にスペースが入らなくなります。

これ以外にも、細かく設定できるので自分好みのスタイルに変更してみてください。

2013年11月21日木曜日

VC++ Compiler November 2013 CTP の noexcept でバグ

Visual C++ Compiler November 2013 CTP で noexcept が使えるようになったので、早速 iutest で noexcept を有効にしてビルドしたのですが、エラーになってしまいました。

再現コードはこちら。
template<typename F>
void f(F func)
{
    func();
}

void g() noexcept
{
}
void h()
{
}

int main() {
    f(g); // OK
    f(h); // error C2664
    return 0;
}

こちらを VC++ でビルドすると下記のエラーが発生します。
error C2664: 'void f<void(__cdecl *)(void) noexcept>(F)' : cannot convert argument 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *)(void) noexcept'

f(g); をコメントアウトするとビルドが通ります。
f<void (*)()>(h); と書き換えてもエラーになります。
また、以下のように g と h を入れ替えてもビルドが通ります。
int main() {
    f(h); // OK
    f(g); // OK
    return 0;
}

どうやら、先に noexcept 付きで実体化されると noexcept でないものまで noexcept を要求されるようです。

gcc では当然通る。
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

とりあえず、バグ報告しておいた。

2013年11月20日水曜日

constexpr 勉強します

Visual C++ Compiler November 2013 CTP が公開され、constexpr が使えるようになったので、
早速自作テスティングフレームワークの iutest で試してみました。
iutest には以前から constexpr 対応を入れてきましたが、動作検証を全くしてませんでした。

見事に失敗
VC++ 2013 CTP の _MSC_FULL_VER は 180021114 なので、その場合は IUTEST_HAS_CONSTEXPR=1 とすることで、constexpr なコードになります。(なるはずだった…)

で、ビルドしたのですが内部エラーやら constexpr として評価できないよ~と言われてしまいました。。。
ひとまず、対象の関数は constexpr 外して一応ビルドは通るようになったのですが…
ご覧の有様。



warning C4592: 'iutest::detail::ToHex': 'constexpr' call evaluation failed; function will be called at run-time
コンパイルタイムになってないよ警告が出まくり…
constexpr を身に付けるため一から出直したいと思います。

第6回大阪Jenkins勉強会に参加しました

第6回大阪Jenkins勉強会に参加しました。
前回参加したのが、第2回でしたので久しぶりにおじゃましました。
Ust があれば見るようにはしてましたが、今回は Windows系の話があったので行くことにしました。

遅刻した!
仕事ががが…
そんなわけで、神谷さんのセッションははじめから聞けなかったので、
あとで資料をじっくり読むとして、感想は控えておきます。
とりあえず、スクリプト大事。

窓辺に立つ執事
今回の目的のセッションで、期待通り自分が知らなかったことを色々聞けてよかったです。
主にツール周りの情報が沢山あったので嬉しかったです。Jenkins 周りはあるある~ッて感じでした。

気になったツールを自分用メモとして書いておきます。
  • Gallio
  • SonarQube
  • White
  • SpecFlow
  • Sikuli

初耳のものが多かったので、とりあえず詳細調べて良さそうなら試してみようかと。

Sonar(Qube) で C++ の静的解析ができるって情報は知ってましたが、現在は Cppcheck を使用中。
時間があれば試す。

White は UI 操作言語?みたいなので、今使っている AutoIt とくらべてみたい。

SpecFlow はデモみた感じでは使ってみたいなと思ったが、大変そうとも思った。

Sikuli は検証してみたことがあるが、その時は狙った操作が上手く書けず、それっきり放置状態。
画像の選別や一致率とかの設定が難しかったイメージ。
試したのが1年くらいなので、もう一度トライしてみようかな。

というわけで、いろいろと収穫の多い勉強会でした。
殴り書きで申し訳ないですが、感想おわり。

2013年11月11日月曜日

Arduino はじめました(最終報告)

前回から大分時間が経ってしまいました。

結果から言うと、なんとかギリギリ出来上がりました…
(当日の朝まで、現場で調整してました…)
最終的には、このような形になりました。


前回までの配線では、点灯する LED の数で明るさに差ができてしまっていたので、
アノードにつながるシフトレジスタからの出力を、トランジスタアレイで増幅してます。


あと、原因がよくわかっていないのですが、
根本的な処理をライブラリ側に書き出していたのですが、
メイン側のデータ配列(LEDの点滅パターンとか)を増やすと、
なぜかライブラリ側のデータをぶっ壊すような挙動をすることがあったり、
単純にデータが多くてもぶっ壊れたり、よくわからない動作をしていたので、
やりたいことが全部載せられませんでした。。。
結局、その辺の調整をするために当日ギリギリまで作業することに…

色々と、点灯パターンを用意したのですが…残念。


とりあえず、目的は達成したのでしばらく Arduino からは離れますが、
そのうち、イーサネットシールドでも買って、Jenkins の XFD にでもしようかなと思います。





2013年11月5日火曜日

ClangOnWin を使ってみた

clang を Windows でも簡単に使いたいと思い、ビルド済みのものを探していたら
ClangOnWin」というものを見つけたので試してみました。

インストール
ClangOnWin のページからインストーラーがダウンロードできますので、
そちらを取得したらインストーラーを起動します。(※ この記事では LLVM-3.4.svn-win32-2013.11.01-193854.exe を使用しました)


起動したら特に変更なくデフォルト設定のままインストールをします。

ツールセット
インストールが完了すると Visual Studio のプラットフォームツールセットに LLVM が追加されます。


これを LLVM-vs2013(2010,2012) にすることで clang でのビルドができます。

ビルドしてみる
早速ビルドしてみると大量に警告がでます。

Visual Studio のコンパイラオプションがないため警告が出ているだけなので、
気にすることはないですが、うるさいのでプロジェクトの修正をしました。(メンドクサイ…)

コンパイルオプションの警告を取り除きましたが、まだ警告が・・・

今回試しにビルドしているプロジェクトでは _s 系の関数は使わず pragma で警告を抑止しているため上記のような警告が出てしまった。
今後も _s に書き換える方針はないので、今回も警告を抑止した。(pragma は使えないので _CRT_SECURE_NO_WARNINGS を define しました)
実際、この辺みんなどうしているのだろうか?

ビルドエラー
LLVM-vs2013 でビルドしたのですが、 type_traits でエラーが出てしまいました。


LLVM-vs2012 でもエラーが…


error: cannot mangle RTTI descriptors for type 'codecvt' yet
ちょっとお手上げです…
もうしばらく弄ってはみるので、何かわかったらここで報告します。
(解決策も募集!)

追記 11/5
もう少し調べてみたら ClangOnWin のファイルリストのページに説明が書いてありました。
それによると、RTTI は使えないようです。また、-D_HAS_EXCEPTIONS=0 も必要なようです。
RTTI を無効にするには、「プロジェクト」 - 「プロパティ」からプロパティダイアログを開き、「C/C++」 - 「言語」 - 「ランタイム型情報を有効にする」 を 「いいえ(/GR-)」 に設定します。

これで、ビルドが通るかと思ったのですが、まだダメでした。。。残念
error : cannot mangle the name of type 'basic_streambuf' into RTTI descriptors yet