[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"

のようです。

| | コメント (0)

[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;
}

| | コメント (0)

[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);

| | コメント (0)

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

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

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

| | コメント (0)

[Delphi] 実数を整数部分と小数部分に分ける

Frac関数、およびInt関数を使用します。

uses System,Math;

var
 J:Extended;
 I:Integer;
 S:Extended;
begin
 J:=1.23;

 I:=Int(J); //整数部分 1
 S:=Frac(J); //小数部分 0.23
end;

| | コメント (0)

[BCB] Delphiのwith文に対応するものは?

Delphiにはwith文を使って、長いコードを省略することができます。例えば以下のようです。

with Form1.Image1.Picture.Bitmap.Canvas do begin
 MoveTo(0,0);
 LineTo(1,1);
end;

BCBでも使いたいところですが残念ながらBCBにはwith文はありません。その代わりに次のようにして書くことができます。

TCanvas *Canvas=Form1->Image1->Picture->Bitmap->Canvas;
Canvas->MoveTo(0,0);
Canvas->LineTo(1,1);

| | コメント (0)

[Delphi] 動的に配列を作成する

var
 Arry: array of Char; //1次元配列
 Arry2: array of array of Char; //2次元配列
begin
 //1次元配列の場合
 SetLength(Arry, 256);

 //2次元配列の場合
 SetLength(Arry2, 30);
 SetLength(Arry2[0], 100);
 SetLength(Arry2[1], 100);
end;

| | コメント (0)

[BCB] 使えるデータ型とサイズ

BCBで使用できる32ビットのデータ型とサイズ

バイト範囲
unsigned char10 ≦ X ≦ 255
char1-128 ≦ X ≦ 127
short int2-32,768 ≦ X ≦ 32,767
unsigned int40 ≦ X ≦ 4,294,967,295
int4-2,147,483,648 ≦ X ≦ 2,147,483,647
enum4-2,147,483,648 ≦ X ≦ 2,147,483,647
unsigned long40 ≦ X ≦ 4,294,967,295
long4-2,147,483,648 ≦ X ≦ 2,147,483,647
float41.18 * 10^-38 < |X| < 3.40 * 10^38
double82.23 * 10^-308 < |X| < 1.79 * 10^308
long double103.37 * 10^-4932 < |X| < 1.18 * 10^4932

| | コメント (0)

[BCB] 関数をプロパティに代入するには

関数型を __closure という指定をつけてtypedefします。

typedef void __fastcall (__closure *TMyEvent)(int State);

class TMyClass
{
private:
 TMyEvent *FOnMyEvent;
  :
public:
 __property TMyEvent *OnMyEvent={read=FOnMyEvent, write=FOnMyEvent};
  :
};

| | コメント (0)

[BCB] AnsiString型はchar *に変換できない!?

AnsiStringをchar *に代入したいときは、c_str() を使用します。

char *dest;
AnsiString src="test";

//dest=src; これはエラーになる
dest=src.c_str();

c_str() を使う際の注意点。
AnsiString::c_str() は一時的な領域をを指すポインタを返します。このポインタは,それが使われている文の実行が終了すると不定になってします。 そのため、 c_str() が指す領域を変更するような処理をしてはいけません。

| | コメント (0)

[BCB] 動的に配列を生成する

char *buf=NULL;

buf=new char[1024];
/* bufを使った処理 */
delete [] buf;

確保した配列を解放するときに[ ]を付け忘れると、配列の最初の要素だけが解放されることになります。書き忘れないように注意しましょう。

| | コメント (0)

[BCB] int型やlong型の最大値

定数名説明
CHAR_MINchar型の最小値
CHAR_MAXchar型の最大値
UCHAR_MAXunsigned char型の最大値
SHRT_MINshort型の最小値
SHRT_MAXshort型の最大値
USHRT_MAXunsigned short型の最大値
LONG_MINlong型の最小値
LONG_MAXlong型の最大値
ULONG_MAXunsigned long型の最大値
INT_MINint型の最小値
INT_MAXint型の最大値
UINT_MAXunsigned int型の最大値

| | コメント (0)

[BCB] MAX、MINマクロ

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

| | コメント (0)