クラス内宣言時初期化のバグ

Visual Studio 2013 で以下のようなコードを実行すると、おかしな値が表示されます。

#include <stdio.h>

struct Hoge {
    struct {
        double value = 123;
    } data;
};

int main(int argc, char **argv)
{
    Hoge hoge;
    printf("%f\n", hoge.data.value);
    return 0;
}

構造体の中に無名構造体があって、その中で宣言時初期化を記述しています。

内側の構造体が、無名ではなく、名前を付けると、期待通りに動作します。

Visual Studio 2015 では修正されているようです。

 

カテゴリー: 未分類 | コメントをどうぞ

Qt5.6 static がコンパイルできない

Debian GNU/Linux 8 (jessie) で、Qt5.6 SDK(スタティックリンク版)を作ろうとしています。

最初にXCB関係のパッケージをインストールしておきます。

apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-xinerama0-dev

qt-everywhere-opensource-src-5.6.0.tar.gz を展開してから、下記のようにconfigureします。

./configure -static -nomake examples -prefix /opt/Qt5.6.0-static

終わったらmakeします。同じ手順で、Qt5.5.1なら成功するのですが、Qt5.6.0だと次のようなエラーが出ます。

g++ -c -pipe -O2 -std=c++1y -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_MTDEV -DQT_NO_LIBUDEV -DQT_NO_TSLIB -DQT_NO_LIBINPUT -DQT_NO_XKB -DQT_QML_DEBUG_NO_WARNING -DQT_USE_QSTRINGBUILDER -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I../../include -I../../include/QtQml -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtNetwork -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtCore/5.6.0 -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtCore/5.6.0/QtCore -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtWidgets -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtGui -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/include/QtCore -I.moc -I/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/mkspecs/linux-g++ -o .obj/moc_conf.o .moc/moc_conf.cpp
g++ -Wl,--gc-sections -Wl,-O1 -fuse-ld=gold -Wl,--enable-new-dtags -o ../../bin/qml .obj/main.o .obj/qml_qml_plugin_import.o .obj/qml_plugin_import.o .obj/qrc_qml.o .obj/moc_conf.o   -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative/lib -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/lib -lQt5Widgets -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative/plugins/qmltooling -lqmldbg_debugger -lqmldbg_local -lqmldbg_native -lqmldbg_profiler -lqmldbg_server -lqmldbg_tcp -lQt5Qml -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/plugins/bearer -lqconnmanbearer -lqgenericbearer -lqnmbearer -lQt5Network -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/plugins/platforms -lqxcb -lQt5XcbQpa -lX11 -lX11-xcb -lXi -lxcb-render-util -lxcb-render -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr -lxcb-shape -lxcb-keysyms -lxcb-xinerama -lQt5PlatformSupport -lfontconfig -lfreetype -lQt5DBus -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtimageformats/plugins/imageformats -lqdds -lqicns -lqtga -lqtiff -lqwbmp -lqwebp -L/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtbase/plugins/imageformats -lqico -lQt5Gui -lpng -lqtharfbuzzng -lQt5Core -lz -lqtpcre -lm -ldl -lrt -lpthread
/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative/lib/libQt5Qml.a(qqmldebugconnector.o):qqmldebugconnector.cpp:function _GLOBAL__sub_I_qqmldebugconnector.cpp: error: undefined reference to 'qt_static_plugin_QQmlInspectorServiceFactory()'
collect2: error: ld returned 1 exit status
Makefile:93: recipe for target '../../bin/qml' failed
make[3]: *** [../../bin/qml] Error 1
make[3]: Leaving directory '/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative/tools/qml'
Makefile:96: recipe for target 'sub-qml-make_first' failed
make[2]: *** [sub-qml-make_first] Error 2
make[2]: Leaving directory '/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative/tools'
Makefile:70: recipe for target 'sub-tools-make_first' failed
make[1]: *** [sub-tools-make_first] Error 2
make[1]: Leaving directory '/home/soramimi/a/qt-everywhere-opensource-src-5.6.0/qtdeclarative'
Makefile:324: recipe for target 'module-qtdeclarative-make_first' failed
make: *** [module-qtdeclarative-make_first] Error 2

qqmldebugconnector.cpp が参照している qt_static_plugin_QQmlInspectorServiceFactory() が定義されていない、ということのようですが、この対策方法はあるでしょうか?

カテゴリー: 未分類 | 3件のコメント

BigQlock

Raspberry Pi向け、時計アプリを開発中です。

bigqlock

元は、Palm OS用のBigClockというアプリです。もうちょっとできてきたらソース公開します。

http://www.soramimi.jp/bigqlock/

カテゴリー: 未分類 | コメントをどうぞ

Windowsで実行中のOSが64ビットか確認する方法

備忘録です。

bool is64()
{
    void (WINAPI *fn_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
    HMODULE hm = LoadLibrary(L"kernel32");
    (FARPROC &)fn_GetNativeSystemInfo = GetProcAddress(hm, "GetNativeSystemInfo");
    if (fn_GetNativeSystemInfo) {
        SYSTEM_INFO info;
        fn_GetNativeSystemInfo(&info);
        if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
            return true;
        }
    }
    return false;
}
カテゴリー: 備忘録 | コメントをどうぞ

Raspberry Pi 7インチ公式タッチディスプレイ

http://akizukidenshi.com/catalog/g/gM-09917/

Raspberry Pi 7インチ公式タッチディスプレイで、液晶画面のバックライトをON/OFFしたり、輝度を変更する方法。

バックライトをOFF

echo 1 > /sys/class/backlight/rpi_backlight/bl_power

バックライトをON

echo 0 > /sys/class/backlight/rpi_backlight/bl_power

バックライトの輝度を変更

echo 80 > /sys/class/backlight/rpi_backlight/brightness
カテゴリー: 未分類 | コメントをどうぞ

WindowsでQtでOCX

Windows上でQtを使ってOCX(ActiveXコントロール)を作っています。

https://github.com/soramimi/ActiveQtExample

↑ここまでできています。

MyControlとMyAppというプロジェクトがあります。前者はOCXです。後者はexeアプリケーションで、メインウィンドウにOCXが貼り付けてあります。

それぞれのプロジェクトをリリースビルドします。

build/release フォルダに移動します。Qt SDKのbinフォルダから、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dllの3つをコピーします。続いて、

regsvr32 MyControl.dll

を実行して、コントロールを登録します。(登録解除するには /u を付けて実行します)

MyApp.exeを実行すると、ウィンドウが表示され、楕円が描画されます。メインウィンドウはMyApp.exeが表示し、楕円はMyControl.dllが描画するようになっています。

activeqt

ウィンドウの閉じるボタンを押すと、閉じることはできますが、タスクマネージャーを見ると、MyApp.exeが残ったままになっています。

本家フォーラムにも、同様な現象が報告されているのですが、進展がないようです。

この不具合は、MyApp.exeがリリースビルドの時だけ発生し、デバッグビルドにすると、正常に動作するようです。

また、MyAppのメインウィンドウに、下記のようなコードを追加すると、プロセスは終了しますが、根本的な解決ではないような気がします。

#include <windows.h>

void MainWindow::closeEvent(QCloseEvent *e)
{
    PostQuitMessage(0);
    QMainWindow::closeEvent(e);
}

開発環境: Windows 7 (64bit)  / MSVC2013 / Qt5.5.1


これは仕様っぽい?

https://bugreports.qt.io/browse/QTBUG-29116

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
    return a.exec();
}

最後のウィンドウが閉じたときに、アプリケーションを終了する、って明示的に書かないといけないのかな。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    a.setQuitOnLastWindowClosed(true);
    return a.exec();
}

これでもいいみたい。ただし、 w.show(); より先に a.setQuitOnLastWindowClosed(true); を実行すると、うまくいかない様です。

カテゴリー: 未分類 | コメントをどうぞ

東急バス降車ボタンキット

東急バス降車ボタンキットに付属するスイッチの結線について解説します。

tomarimasu0

3ピンのコネクタがついています。 中央の黒がGND、白に12Vをかけるとランプがつきます。緑がスイッチです。

tomarimasu1

内部の様子です。

tomarimasu2

コネクタは2mmピッチです。

tomarimasu3

カテゴリー: 未分類 | コメントをどうぞ

Arduinoでコンテナクラス

Arduino IDEを利用してESP8266用の開発をしていて、STLのstd::string、std::vector、std::listを使いたくなったのですが、コンパイルしてみると、大量のリンクエラーが出てしまいました。原因を追及するのが面倒になったので、代替ライブラリを作ってみました。はい、車輪の再発明です。

https://github.com/soramimi/TinyContainer

TinyContainerというフォルダの中に、TinyContainer.hというファイルが入っています。このフォルダを圧縮して、TinyContainer.zipを作ります。これを[スケッチ][Include Library][Add .ZIP Library...]を選択して、登録します。

addlib

一旦Arduino IDEを終了して、再起動します。

newlib

[Include Library]の下の方に[TinyContainer]が登録されます。これを選択すると、スケッチに #include <TinyContainer.h> が追加されます。

使い方は、STLのstring、vector、listとだいたい同じです。名前空間はtinyです。tiny::string、tiny::vector、tiny::listとして使用できます。

間に合わせで作ったため、完全に規格に準拠した設計にはなっておらず、多少異なる点があるかと思います。基本的な、文字列、動的配列、双方向リンクリストとして使用することはできます。辞書(map)は複雑なので作っていません。

登録したライブラリをアンインストールする場合は、以下のフォルダを削除します。

C:\Users\<username>\Documents\Arduino\libraries\TinyContainer

カテゴリー: 未分類 | コメントをどうぞ

SONYのWi-Fi対応デジカメで写真の転送ができない件

Wi-Fiに対応したSONYのデジタルカメラで、PCに写真を転送するには、PlayMemories Home というアプリをインストールするのですが、そのPCをファイルサーバにしているなどで、別のPCからリモートデスクトップ接続でログオンし、そのセッションで PlayMemories Home が動作している場合、または、その状態で、カメラを接続して、Wi-Fi転送の設定を行った場合に、デジカメ側からの写真転送ができないようです。カメラの画面には、「検索中」「接続中」まで出ますが、「転送中」にならずに、永遠に待ち続けるという症状になります。

この件について、SONYに問い合わせ中です。

デジカメの機種に依存しているかどうかは不明です。(筆者のはDSC-HX30Vというものです)

【追記】 SONYでは、リモートデスクトップ接続の環境で、PlayMemories Homeの動作確認は行っていないとの回答。急がないので、できたら対応してください、と、要望を出しておきました。

カテゴリー: 未分類 | コメントをどうぞ

Pi-DAC+

秋月電子通商で購入できる Raspberry Pi 用オーディオモジュールPi-DAC+を使用するためのメモ。OSは標準のRaspbianを想定。

詳細は http://www.iqaudio.com/downloads/IQaudIO.pdf

抜粋すると、

  1. rpi-update を実行する。
  2. /boot/config.txt に dtoverlay=iqaudio-dacplus という定義を追加する。
  3. 再起動する。
  4. aplay -l を実行して、認識されたか確認する。

これだけで、使用できるようになるはずだが、ついでに、標準のオーディオ出力を無効にしたかったら、 /etc/modules の snd-bcm2835 をコメントする。

カテゴリー: 未分類 | コメントをどうぞ