ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

C/C++

WindowsのコンソールアプリケーションでGetMessageを使わずにタイマーを使う

メッセージループを自分で書かずにWindowsのコンソールアプリケーションでタイマーを使う方法が無いか調べたところ、 CreateTimerQueueTimer関数 というものを見つけました. 以下プログラムは、約100msごとにHelloという文字列がコンソールに表示されます. #…

DLLがあるのに見つからない

DLLを利用するEXEを実行したところ、プログラムと同じフォルダにDLLがあるにも関わらずDLL周りのエラーが生じることがありました. 原因はEXEが利用するDLLがさらにほかのDLLを参照していたことでした. つまり、EXE --(use)--> DLL1 --(use)--> DLL2 という関…

<algorithm>でポインタを使うときは型に注意

c++の<algorithm>中にはイテレータを引数に渡すことでコンテナの全要素に対して探索をする関数があります. 探索する対象が配列の場合はポインタを引数に渡すことが可能です. 例えばstd::any_of()は次のように使用することができます. #include<iostream> #include<algorithm> #include<vector> using </vector></algorithm></iostream></algorithm>…

C++でbind()が使えない

以下のコードはVisual StudioでWinsock2を使おうとしたときのものです. Microsoftのサンプルコードをコピペしただけなのでビルドできると思いきやコンパイルエラーになります. #include <iostream> #include<WinSock2.h> #include<ws2tcpip.h> #include<functional> /* これがないとリンク時にエラーになる </functional></ws2tcpip.h></winsock2.h></iostream>…

DLLで共有したデータの寿命

Windowsの動的ライブラリ(DLL)中のグローバル変数を複数のプロセスで利用する方法とそのグローバル変数の寿命についてまとめました. DLLでデータを共有する方法 DLLのデータセグメントに置かれた変数は複数のプロセスで共有可能です. なので data_seg pragma…

C/C++でコマンドライン引数の文字数が取得できない

結論から言うとsizeof()じゃなくてstrlen()を使いましょうという話です. x86(32bit)環境で以下のようなプログラムをビルドして実行すると、いかなるコマンドライン引数であっても「size:4」と表示されます. #include<stdio.h> int main(int argc, char** argv){ if(ar</stdio.h>…

size_t型とは

メモリ系のライブラリやコンテナを使っているとよく見るsize_t型についてまとめました. 検証環境 size_t型は処理系依存 size_t型のtypedef宣言 Cの場合 C++の場合 size_t型の意味 検証環境 項目 説明 OS Windows11 MinGW-W64 gcc version 8.1.0 size_t型は処…

dllの中身を表示する -アンマネージ言語編-

Windowsのdllはバイナリなので基本的にはそのままでは何が何だかわかりませんが、Visual Studioについてくるdumpbin.exeを使用すると様々な情報をテキストとして表示することが出来ます. その使い方やオプションについてまとめました. 以下ホストはx64を想定…

C言語で多次元配列をポインタで扱う

多次元配列をポインタで扱う方法です. 多次元配列は結局のところ一次元配列と同じようにメモリが確保されています. 例えば、char型の2次元配列とchar型へのポインタについて、次のことが言えます 2次元配列とポインタの関係 実用上は次のようにキャストして…

C言語のポインタ

C言語のポインタおよびポインタへのポインタの使い方をまとめてみた. 主にint型とint型へのポインタを例に説明する. アドレス演算子&と間接演算子* 単項演算子の&をアドレス演算子という. 二項演算子の&はビット演算子の1つであり、&&は論理演算子の1つであ…

assignment to expression with array typeの意味

次の記事を参照 prupru-prune.hatenablog.com

invalid array assignment の意味

一言でいうと配列名をポインタとしてアドレスを再代入することは出来ないというエラーである. 配列名とポインタの区別がつく場合 配列名とポインタの区別がつかない典型例 コールした関数内ではアドレスが交換できる(ただし、この例はスワップできない) コー…

Windowsでどうしてもリンクできないとき

Window用のC/C++プログラムのビルド時にどうしてもリンクできないときは以下の確認をしましょう 1. verboseオプション 2. ライブラリディレクトリの設定 3. ライブラリファイルの設定 4. シンボル情報 5.そもそも類似名のシンボルも存在しないとき 参考 1. v…

VC++のVisual Studioにおけるビルド

Visual Studio(MSBuild)でVC++をビルドするときの箇条書きメモ. MyProjectというウインドウを持つMFCプロジェクトのx64ビルドを想定. 実行環境 項目 説明 OS Windows11 Visual Studio 2017 ビルドターゲット x64 関連するパス パス 主なファイル 説明 C:\Pro…

VC++でOpenCVを利用する

ビルド済みのOpenCVをインストールしてVisual StudioのC++プロジェクトから利用してみます. 実行環境 インストール Visual Studioで空のプロジェクト作成 追加のインクルードディレクトリ 追加のライブラリディレクトリ 追加の依存ファイル ビルド&実行 トラ…

MSBuildとは

Visual Studioをインストールしたり、個別にBuild Tools for Visual StudioをインストールするとMSBuildがインストールされます. リファレンスでは以下のように説明されています. Microsoft Build Engine は、アプリケーションをビルドするためのプラットフ…

Microsoft Visual C++ Build Tools を個別に入れてみる

Visual Studio 2015のMicrosoft Visual C++ Build Toolsを個別に入れてみて実際のビルドには何が必要なのかを確認しました. 実行環境 項目 バージョン OS Windows11 22H2 Visual Studio 2015 インストーラーの取得 まずはVisual Studioの以前のバージョンを…

Visual Studio におけるC++の種類

なんかよくわからないですけどVisual StudioにおけるC++アプリケーションっていろんな種類があるじゃないですか. 自分なりにまとめてみました. 以下、Visual Studio上のC/C++を総称してMSVCと呼ぶことにします. 実行形式による区分 ネイティブコードの小区分…

C++でのbool型の入出力

C++の標準ストリームにbool型を書き込むと、trueの場合は1、falseの場合は0が表示される. std::boolalphaを事前に書き込んでおくと、文字列として出力される. std::noboolalphaを書き込むと元に戻る. #include<iostream> int main() { std::cout << true << std::endl;</iostream>…

C++のpair型の使い方

実行環境は mingw (GCC 11.2.0) 初期化 要素へのアクセス 標準出力への表示 代入 比較演算子 == < 構造化束縛 参考 初期化 ヘルパ関数std::make_pair()か、初期化子を使うと初期化できる. #include<iostream> using namespace std; int main() { pair<int,int> p1=make_pair(1,2</int,int></iostream>…

深さ優先探索はなぜ難しいのか

いきなりですがタイトル詐欺です. 正しくは「私にとって深さ優先探索はなぜ難しいのか」です. この記事を書こうと思ったきっかけですが、DFSの問題を解くときにDFSで解けると分かっていても実装が出来ないということを何度か体験したからです. なので時間を…

C++でハンドラをシンプルに書きたい

C++でデスクトップアプリケーションを書いているとイベントハンドラ(メッセージハンドラ)を書くことになると思います. ボタンをクリックしたら何かを実行するくらいであれば問題ないですが、右クリック中にマウスを動かしたときはAという動き、マウスホイ…

MFCで他プロセスのウィンドウにメッセージを送る方法

はじめに MFCアプリケーションで他プロセスのメインウィンドウにメッセージを送ってみましょう. 送信用のプログラムではSendMessage()またはPostMessage()を使います. 受信用のプログラムではPreTranslateMessage()を使います. MFCでもWndProcをオーバーライ…

プログラミングでは一般的すぎる名前を使わない方が良い

タイトルの通り、プログラミングにおいて一般的すぎる名前をファイル名やクラス名にすると痛い目に合うかもしれません. 自分が経験した例を2つ紹介します. PHPの例 Windows(xampp)において、index.phpから同ディレクトリ中のtable.phpというファイルをrequir…

LNK4098 defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。の解決方法

Visual Studio 2017で外部ライブラリをNuGetしたプロジェクトでビルドする際に「LNK4098 defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。」が発生した. 公式リファレンスによれば、互換性のない…

';'が'*'の前にありませんの解決方法

Visual Studio でC++のプロジェクトをビルド中、「構文エラー: ';'が'*'の前にありません。」というエラーが出たときの対処法のメモ. まずは文法的な間違いがないかを確認. どこかしらで括弧やセミコロンが抜けていればそこを修正すれば解決するかも. しかし…

gl.h included before glew.h の解決方法

Visual Studio 2017 でOpenGLを使ったアプリケーションを作成中 gl.h included before glew.h というエラーが出た. 原因はメッセージのままなのだが、gl.hがどこにあるのかわからない場合具体的な解決方法は次のようになる. gl.hを含んでそうな適当なヘッダ…

ヘッダファイルの役割

今まで見てきたことがあるパターンを書き出してみた. 関数のプロトタイプ宣言 おそらく一番オーソドックスな使い方. 関数本体が書いてあるオブジェクトファイルor静的ライブラリor動的ライブラリがあるはず. ヘッダーとオブジェクトファイルが一対一対応とは…

Windows.hとafxwin.hの場所

C:\Program Files(x86)以下で検索すれば簡単に見つかるが、たまに知りたくなるのでメモを残しておく. 比較的古い場合(少なくともVS6) ヘッダー名 場所 windows.h C:\Program Files(x86)\Microsoft SDKs\Windows\v.70A\include afxwin.h C:\Program Files(x86…