プログラミング

C++のオーバーロードとオーバーライドの挙動

C++のクラスで public なメンバ関数にオーバーロードがある場合、派生クラスでオーバーロードのどれか一つを private でオーバーライドすると、他のオーバーロードも全て private になる。これは仮想関数であっても非仮想関数であっても同じ。 #include<stdio.h> clas</stdio.h>…

関数の戻り値用テンプレート

C++で、任意の型に成否とエラー番号とエラーメッセージ(へのポインタ) を付加するだけのテンプレート。 関数の戻り値用に。 template <class Type> class Result { public: Type value; bool success; int errorNo; const char* errorMessage; Result<Type>() : value(Type()),</type></class>…

setTimeout()やsetInterval()で関数に引数を渡す

やりたいこと JavaScriptで setTimeout() や setInterval() のタイマハンドラに引数を渡したい。 ダメな書き方 これはダメです。実行するとエラーが発生します。setTimeout() の第1引数に関数ではなく関数の戻り値を渡すことになるからです。しかも、hello()…

C#での日本語文字の扱い

C#のchar型は2バイト C#で下記のようなコードを実行してみます。 using System; class Program { static void Main(string[] args) { char c = 'あ'; int i = (int)c; Console.WriteLine(c); Console.WriteLine("size = " + sizeof(char).ToString()); Conso…

VC++での日本語文字の扱い

デフォルトではシフトJIS Visual StudioでVisual C++の空のプロジェクトを作成し、下記のようなソースを書いて実行してみます。 #include<stdio.h> #include<string.h> int main(void) { char s[] = "あいうえお"; int len = strlen(s); printf("%s\n", s); printf("length = %d</string.h></stdio.h>…

簡単な例で C/C#/Rust のメモリ管理を比較

C言語と C#と Rustとで、動的メモリ管理の考え方の違いと、そのメリット・デメリットについて考えます。 (1) C言語の場合 C言語の場合、動的メモリ(ヒープ)は malloc関数で確保し、free関数で解放します。確保したメモリはプログラマが責任をもって解放しな…

メモ:WindowsでRustの開発環境

前提 Windows に Visual Studio と VSCode はインストールずみ 開発環境のインストール Install Rust - Rust Programming Language] から rustup-init.exe をダウンロードしてインストール。 VSCode の Extensions で rust-analyzer 拡張機能をインストール…

メモ:VSCodeでVBA

Excel VBAの困ったところ VBのソースがExcelブックに抱き込まれているため差分管理が困難。 Editorが古臭く、不便で使いづらい。 有志が作成したアドインを入れないと行番号すら表示されない。 VSCodeの拡張機能をインストール VSCode の Extensions で「XVB…

メモ:VBAのコードに行番号表示

Excel VBA マクロでコードの行番号を表示する方法 アドインのインストール AddLineNumbersアドインをダウンロード AddLineNumbers VBA for x64 (64bit) AddLineNumbers VB6/VBA (32bit) コマンドプロンプトを管理者として実行 (c:\Windows\system32 がカレン…

VSCodeで組込み系のソースを編集

やりたいこと VSCodeで組込み系マイコンのCソースを編集したい。 ビルドやデバッグは別のIDEでやるのでできなくていい。 前提 VSCodeに拡張機能 C/C++ がインストールされていること。 とりあえずこれだけで、構文ハイライトやナビゲーション、インテリセン…

メモ:VSCodeの文字化け

やんごとなき理由でShift-JISで書かれたファイルをVSCodeで編集しようとすると、文字化けが起こる。VSCodeのデフォルトの文字コードはUTF-8なので当然である。設定で、Files:Auto Guess Encoding にチェックを入れるといちおう文字コードを自動判別するよう…

arctanの近似計算

arctan関数の近似計算として、3次のガウス求積法による近似式は、角度をラジアンから度数法に換算すると C言語のコード この近似計算をおこなうC言語のコードを以下に示す。 なお、浮動小数点実数にはdouble型ではなくfloat型を用いている。計算の精度からし…

Arduino IDEからPlatformIOへ移行

Arduino IDEの問題点 PlatformIOとは? PlatformIOの導入 プロジェクトの作成から書き込みまで プロジェクトの作成 ビルドと書き込み ポート指定 シリアルモニター ライブラリの導入 サンプルコード 既存のプロジェクトを開く 既存のArduinoスケッチのインポ…

gitでdiffの文字コードのみShift JISに設定する

課題 Source Treeでgitを使用 歴史的経緯でShift JISのファイルがある diffが文字化けする [ツール]→[オプション]から「デフォルトの文字コード」を「shift_jis」にしてしまうとコミットログなどもShift JISになってしまう。(過去にutf-8で書かれたログが文…

C言語:可変長引数のマクロと関数、およびデバッグ用printf

デバッグ用printfでよく使うテクニックだが忘れがちなこと。 可変長引数のマクロ 引数の可変長部分を ... で表記する。 特別な識別子 __VA_ARGS__ が可変長引数に置換される。 #define DEBUG_PRINT(fmt, ...) printf(fmt, __VA_ARGS__) 可変長引数の関数 std…

Javascriptでバイナリの構造体を扱う

ArrayBufferとDataViewとUint8Arrayでごにょごにょすればいいらしい。 function setData() { const longitude = 139.6917; const year = 2023; const month = 5; const day = 28; const hour = 12; const min = 30; const aBuffer = new ArrayBuffer(10); co…

定数マクロの退避と復帰

定数マクロの弊害として、スコープに関係なく置換されるため、意図しない所でエラーになることがあります。 #include<stdio.h> #define HOGE 666 int main() { printf("HOGE = %d\n", HOGE); int HOGE = 314; // ← HOGEが666に置換され、エラー printf("HOGE = %d\n",</stdio.h>…

VB6のプロジェクトをVB.NETに変換

はじめに Visual Studio 2005/2008 にはVB6のプロジェクトをVB.NETに変換する機能 (「アップグレード」と称する) があったが、現在のVisual Studio 2019 にはない。 そこで、VS2008をインストールし、いったんVB6のプロジェクトをVS2008で開いてアップグレー…

VB.NET → C# 移植メモ

C#への自動変換 方法1: SharpDevelopでプロジェクトをコンバートする。 方法2: ビルドしたアセンブリ(.exeや.dll)をILSpyで逆コンパイルする。 方法1はソースレベルでの変換のため可読性は高い(コメントも保持される)が、ビルドエラーが多発する。On Error G…

VB6/VBA → VB.NET 移植メモ

他にもたくさんあるだろうが、気づいたものを列挙。 大きな違い いちばんの違いは、本格的なクラスベースのオブジェクト指向言語になったこと 既存のVB6/VBAのソースがきちんとクラス化/モジュール化されていない密結合なコードの場合、ソースをなるべくその…

高速逆平方根(fast inverse square root)のアルゴリズム解説

高速逆平方根とは? C言語のコード 検証 アルゴリズムの要点 [1] 逆平方根の計算を対数・指数の計算に置き換える [2] 浮動小数点型の内部表現を利用した対数・指数の近似計算 [2.1] 対数の近似 [2.2] σの最適値 [2.3] 整数型での解釈 [2.4] 逆平方根の計算と…

2^x と log2(x) の高速な近似計算

C言語のfloat型のバイナリ表現形式に着目すると、2^x と log2(x) の近似値を高速に計算できます。 float型のバイナリ表現形式 float型は32ビットで、仮数部が23ビット(ケチ表現)、指数部が8ビット、MSBが符号ビットです。⇒ 単精度浮動小数点数 - Wikipediaこ…

Androidアプリでのファイル読み書き

※ 今さらな内容のメモです。かなり古い内容を含んでいる可能性があります。Androidアプリで設定データなどを保存するにはSharedPreferencesを用いるのがいちばん簡単である。 しかし、USB接続でデータファイルをPCとやりとりしたい場合もある。その場合、フ…

UIスレッドで実行させる (雑な話)

UIスレッド(メインスレッド)以外のスレッドからUIを操作したいとき、Windows (.NET)でもAndroid (Java)でも直接操作することは許されない。そういうときはUIスレッドに処理を依頼する形を取る。WindowsならControl.Invoke()またはControl.BeginInvoke()、And…

メモ: 未使用変数の警告を回避するマクロ (C言語)

コンパイル時に未使用変数の警告を出してくれるのは有用であるが、特定の変数が未使用であることを許容したい場合もある。そのような場合に下記のようなマクロを用意しておくと便利である。 #define UNUSED(x) (void)(x) 例えば下記のように使う。これによっ…

undefined reference to `typeinfo for クラス名'

C++で「undefined reference to `typeinfo for クラス名'」というよく意味の分からないエラーに遭遇した。 undefined reference to `typeinfo for BMI160Class'どうも仮想関数(virtual が付いてる関数)を持つクラスで、仮想関数の最初の親クラスで実体が定義…

C#でゲームパッド入力

Windowsではゲームパッド入力はDirectXを介するのでキーボード入力ほど簡単には扱えない。C#アプリでゲームパッド入力を取るにはDirectXをラップしたなんらかの.NETライブラリが必要になる。このようなライブラリには有名なものとして SlimDX と SharpDX が…

オブジェクト初期化子

C#って、 class Hoge { public int a; public int b; public int c; } というクラスに対して var hoge = new Hoge() { a = 1, b = 2, c = 3 }; という初期化の書き方ができるらしい。いま知った。 オブジェクト初期化子というらしい。 var hoge = new Hoge {…

秀丸おじさんのVSCode入門

※この記事はかなり偏った思想にもとづいて書かれています。20年以上も秀丸を使い続けてきたおじさんだけど、ついにVSCodeへの移行をはじめている。VSCodeはたしかにすごく便利なのだけど、長年秀丸を使ってきた者にとっては痒いところが多々あるのも事実。と…

gitのベアリポジトリ、ノンベアリポジトリとは?

ベアリポジトリ(bare repository) = 作業コピーを含まないリポジトリ ノンベアリポジトリ(non-bare repository) = 作業コピーを含むリポジトリ ベアリポジトリは集中管理用 つまり、リモートリポジトリはベア、ローカルリポジトリがノンベアが基本 ノンベア…