C/C++ で型の相互変換を実装する際に、相互インクルードを防ぐ方法
2025-02/22
シリアライザを作った際のメモです。 シリアライザとは、構造体等のオブジェクトをバイト列に変換する機能です。通信関係のライブラリを作る際に必要になったため自作しました。 実装する際には、環境の違いによって変換後のバイト列の順序やサイズが異なる可能性があるためなかなか大変です。オブジェクトをバイト列に変換した際、CPU のエンディアンや ABI、コンパイラの仕様によって、データの配置やパディングの有無が変わることがあります。そのためこれらを完全に理解し、環境差を吸収する実装をしないといけないです:D 実装時に気をつける環境の違いによる影響: エンディアンが異なる点 浮動小数点型のサイズが異なる点 構造体のパディングサイズが異なる点 実装したこと: メンバ変数を列挙する黒魔術(パディングによるサイズの違いの対策) シリアライズ後のサイズをコンパイル時に算出する エンディアン変換 浮動小数点型のサイズが異なる問題の対策 エンディアン オブジェクトをメモリに配置する際のバイト列の並び順のことです。主にビッグエンディアンとリトルエンディアンの 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 のライブラリにテストを追加する方法を紹介します。
2024-10/22
ライブラリ開発者の精神を保つ方法を紹介します。
2024-10/19
通常、Arduino のライブラリは、サブディレクトリにあるヘッダーファイルや、拡張子無しファイルをインクルードすることができません。これを実現する裏技を紹介します。
2024-10/18
Arduino 系の関数やライブラリの多くに、コールバック関数からメンバにアクセスできないという問題があります。その原因と解決策について説明します。
2024-10/16
Arduino 向けの C++ ライブラリです。ロボコンでよく使うアクチュエータのドライバ、通信機能を関数、クラスとして提供しています。
2024-10/16
WebSocket を通じて PC やスマホから調光可能なモニターライトです。
2024-09/22
ロボットに搭載されている紙飛行機の発射機構の操縦アプリです。キーボードでロボットを動かして遊べます。 2022 年度全国高専ロボコン 四国地区大会、全国大会で使用しました。
2022-11/28
自動対戦可能なオセロです。Arduino を用いて初めて作ったプロジェクト。
2021-08/31