フリーソフト

C++言語・Pascal言語

[C++Builder] SIMD

#include <nmmintrin.h>   // MMX-SSE4.2
#include <smmintrin.h>   // MMX-SSE4.1
#include <intrin.h>      // MMX-SSE3
#include <emmintrin.h>   // MMX-SSE2
#include <xmmintrin.h>   // MMX-SSE
#include <mmintrin.h>    // MMX

 

[BCB] アラインメントの設定

#pragma pack(push,1)
struct TAPP1Header {
  WORD Maker;
  WORD Size;
  byte Magic[6];
};
#pragma pack(pop)

[BCB] 関数のtypedef

typedef int (__stdcall *TMyFunc)(int Param1,int Param2);

[Delphi,BCB] StrToIntで例外が発生するのがめんどくさい

StrToIntは文字列を数字に変換するための関数ですが、引数に数字として不正な文字列(例えば「125a」とか)を渡すと例外が発生してしまいます。これをきちんと処理するのが面倒だったり、単純に不正な文字列が渡された場合は-1を返してほしいと思う場合があったりします。そういう時に便利なのがStrToIntDefという関数です。

i:=StrToIntDef(Edit1.Text,-1);

というようにデフォルト値を指定して変換ができます。変換に失敗した場合はデフォルト値が返される仕組みです。例外は発生しません。場合によっては非常に便利な関数です。

[BCB] DLLのヘッダファイルの書き方

#ifndef HeaderH
#define HeaderH
//

[BCB] sprintfやDelphiのFormatのような関数は?

AnsiStringのsprintfメソッドを使います。
書式はDelphiのFormat関数と同じような感じです。

AnsiString Str=AnsiString().sprintf("%.5d",i);

[Delphi] 独自のリソースを使う

リソースをテキストエディタなど作成して「tmp.rc」というような名前で保存します。そのファイルをプロジェクトに追加してコンパイルします。rcファイルをBRCC32でコンパイルしてresファイルに変換しなくてもOKです。

リソースファイル(*.rc)の中身は

リソース名  リソースタイプ  "ファイル名"

のように書きます。例えば、

MYICON  ICON  "MyIcon.ico"
MYBMP  BITMAP  "MyBmp.bmp"

のようです。

[BCB] caseでローカル変数の初期化がとばされた?

switch文のcaseでローカル変数を以下のように使おうとすると、「caseでローカル変数の初期化がとばされた」というようなエラーメッセージが表示されてしまいます。

switch (Value) {
case 0:
  int i=0;
     :
  break;
default:
     :
  break;
}

このようなことをしたいときは時は次のようにcaseの中をブレースで括ります。

switch (Value) {
case 0:
  {
  int i=0;
     :
  break;
  }
default:
     :
  break;
}

[BCB] EnumWindowsでコンパイルが通らない

ウインドウの一覧を得るEnumWindowsというAPIがありますが、C++Builder6.0でこの関数を使用すると以下のようなエラーがでる場合があるようです。

----
E2034 'int (__stdcall *)(void *,long)'型は'int (__stdcall *)()'型に変換できない
E2342 パラメータ 'EnumWndProc' は int (__stdcall *)() 型として定義されているので int (__stdcall *)(void *,long) は渡せない
----

以下のように強制的にキャストをかけてしまえばコンパイルできるようになります。きちんと意図した動作もしているようです。

//関数の定義
BOOL CALLBACK EnumWndProc(HWND hWindow,LPARAM lData)
{
   :
}

//呼び出し
EnumWindows((WNDENUMPROC)EnumWndProc,0);

[BCB] コンポーネントの継承元(祖先)を判定する

Form上のコンポーネントのうち、ある特定のクラスから派生しているものだけに対して処理をしたい場合に使えるテクニックです。以下は、TControlから派生したクラスに対してのみ処理をする場合の例です。

  for (int i=0;i<ComponentCount;i++) {
    if (Components[i]->InheritsFrom(__classid(TControl))) {
      TControl *Ctrl=(TControl *)Components[i];
      
      //何か処理をする
    }
  }