C++

メンバ変数を列挙する
メンバ変数を列挙する

C++のテンプレート黒魔術を用いて、構造体のメンバ変数を再帰的に列挙する方法を解説します

2025-05/14

ソートアルゴリズムについてのまとめ
ソートアルゴリズムについてのまとめ

有名どころのソートアルゴリズムの計算量について

2025-05/14

型の相互変換を実装する際に相互インクルードを防ぐ方法
型の相互変換を実装する際に相互インクルードを防ぐ方法

C/C++ で型の相互変換を実装する際に、相互インクルードを防ぐ方法

2025-02/22

シリアライザを作る
シリアライザを作る

シリアライザを作った際のメモです。 シリアライザとは、構造体等のオブジェクトをバイト列に変換する機能です。通信関係のライブラリを作る際に必要になったため自作しました。 実装する際には、環境の違いによって変換後のバイト列の順序やサイズが異なる可能性があるためなかなか大変です。オブジェクトをバイト列に変換した際、CPU のエンディアンや ABI、コンパイラの仕様によって、データの配置やパディングの有無が変わることがあります。 実装時に気をつける環境の違いによる影響: エンディアンが異なる点 浮動小数点型のサイズが異なる点 構造体のパディングサイズが異なる点 実装したこと: メンバ変数を列挙する黒魔術(パディングによるサイズの違いの対策) シリアライズ後のサイズをコンパイル時に算出する エンディアン変換 浮動小数点型のサイズが異なる問題の対策 エンディアン オブジェクトをメモリに配置する際のバイト列の並び順のことです。主にビッグエンディアンとリトルエンディアンの 2 種類があります。 ビッグエンディアンは上位バイトから下位バイトに向かって配置されます。インターネッツの世界はこれです。イメージ: mem[offset + 0] = obj[0] mem[offset + 1] = obj[1] mem[offset + 2] = obj[2] リトルエンディアンは下位バイトから上位バイトに向かって配置されます。最初に知った時は驚きました。一般的に普及している CPU はリトルエンディアンです。イメージ:

2025-01/29

GitHub Actions と Google Test を使って Arduino のライブラリに動的テストを導入する
GitHub Actions と Google Test を使って Arduino のライブラリに動的テストを導入する

GitHub Actions と Google Test を使って、Arduino のライブラリにテストを追加する方法を紹介します。

2024-10/22

GitHub Actions と arduino-cli を使って Arduino のライブラリに静的テストを導入する
GitHub Actions と arduino-cli を使って Arduino のライブラリに静的テストを導入する

GitHub Actions と arduino-cli を使って、自動的にテストを行う方法を紹介します

2024-10/19

ライブラリのサブディレクトリにあるヘッダーファイルをインクルードできるようにする
ライブラリのサブディレクトリにあるヘッダーファイルをインクルードできるようにする

通常、Arduino のライブラリは、サブディレクトリにあるヘッダーファイルや、拡張子無しファイルをインクルードすることができません。これを実現する裏技を紹介します。

2024-10/18

メンバ関数をコールバック関数として渡せられない原因と解決策
メンバ関数をコールバック関数として渡せられない原因と解決策

Arduino 系の関数やライブラリの多くに、コールバック関数からメンバにアクセスできないという問題があります。その原因と解決策について説明します。

2024-10/16

UdonLibrary
UdonLibrary

Arduino 向けの C++ ライブラリです。ロボコンでよく使うアクチュエータのドライバ、通信機能を関数、クラスとして提供しています。

2024-10/16

💡 IoT MonitorLight 💡
💡 IoT MonitorLight 💡

WebSocket を通じて PC やスマホから調光可能なモニターライトです。

2024-09/22