GetMessage()関数


BOOL GetMessage(
 LPMSG lpMsg,
 HWND hWnd,
 UINT wMsgFilterMin,
 UINT wMsgFilterMax
);

メッセージキューからメッセージを取得する

lpMsglpMsgに指定したMSG構造体にhWndのメッセージを抽出する
hWndウインドウを特定せず、すべてのメッセージを受け取る場合はNULLを指定
wMsgFilterMin
wMsgFilterMax
取得するメッセージを特定の範囲に限定したい場合に利用するフィルタ
通常は、すべてのメッセージを処理する必要があるので0を指定する

一般的な使用例

while ( GetMessage( &msg, NULL, 0, 0 ) ) {
 TranslateMessage( &msg );
 DispatchMessage( &msg );
}


・GetMessage()関数は処理するメッセージが発生するまで制御を返しません。
・TranslateMessageは、一部のメッセージをプログラムで扱いやすいように変換するAPIです。
・DispatchMessageは、MSG構造体のhwndメンバーを参照して、そのウィンドウ・プロシージャを呼び出すようにWindowsに依頼します。
Windows > メッセージループ | comments (0) | trackbacks (0)

MSG構造体


typedef struct tagMSG {
 HWND hwnd;
 UINT message;
 WPARAM wParam;
 LPARAM lParam;
 DWORD time;
 POINT pt;
} MSG;

MSG構造体は、スレッドのメッセージキューからのメッセージ情報を保持します。

hwndメッセージを受け取るウィンドウプロシージャを持つウィンドウを識別します。
messageメッセージ番号を指定します。
wParamメッセージの付加情報を示します。意味はmessageメンバの値によって特定されます。
lParamメッセージの付加情報を示します。意味はmessageメンバの値によって特定されます。
timeメッセージがポストされた時間を示します。
ptメッセージがポストされたときのカーソル位置を画面座標で示します。


一般的なメッセージはwinuser.hの中で、「WM_」で始まるシンボルとして数百個が定義されています。
メッセージはmessageメンバに格納され、そのパラメータがwParamとlParamメンバに格納されます。
WPARAMとLPARAMは単純な整数型ですが、情報が多い場合は構造体へのポインタをパラメータとすることもあります。
Windows > ウィンドウプロシージャ | comments (0) | trackbacks (0)

RegisterClass()関数

ATOM RegisterClass( CONST WNDCLASS *lpWndClass );

ウィドウクラスの作成に失敗すると0を返します。
アトムはシステムがグローバルに管理している整数値です。
この場合は登録されたクラスを一意に示す整数値を返します。
Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

ウィンドウクラスの登録


typedef struct {
 UINT style;
 WNDPROC lpfnWndProc;
 int cbClsExtra;
 int cbWndExtra;
 HINSTANCE hInstance;
 HICON hIcon;
 HCURSOR hCursor;
 HBRUSH hbrBackground;
 LPCTSTR lpszMenuName;
 LPCTSTR lpszClassName;
} WNDCLASS;


WNDCLASS構造体は、ウィンドウクラスを記述する各種のフィールドで構成されます。

styleウィンドウの基本的な設定を行うビットフラグを指定する。
lpfnWndProcウィンドウプロシージャ。拡張の必要が無ければDefWindowProc()で良い。
cbClsExtra使用しない。0にする。
cbWndExtra使用しない。0にする。
hInstanceこのウィンドウクラスを登録するアプリケーションのインスタンスハンドルを指定する。WinMain()関数が引数で受け取ったインスタンスハンドルを設定する。
hIconウィンドウのアイコン。NULLを指定した場合は標準のアイコン。
hCursorマウスがウィンドウ上にあるときのカーソル。NULLを指定した場合は、現在のカーソルがそのまま表示される。
hbrBackground背景色。色の値は標準のシステムカラーの1つでなければならない。(選ばれた値には1を加えなければならない。)
lpszMenuNameウィンドウのデフォルトメニューとなるメニューの名前を指定する。
LpszClassName一意のクラス名。

設定の例(ソースとしてのサンプルではありません。)

#define CLASSNAME "Project_Name"

WNDCLASS wc;

wc.style = 0;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;

wc.lpfnWndProc = WndProc;
wc.lpfnWndProc = DefWindowProc; // 拡張の必要が無ければデフォルトのウィンドウプロシージャで良い

wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;

wc.hIcon = NULL;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_PROJECTNAME ) );

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 ); // COLOR_で始まるのはシステムカラーを示す定数

wc.lpszMenuName = 0;
wc.lpszMenuName = MAKEINTRESOURCE( IDC_PROJECTNAME );

wc.lpszClassName = CLASSNAME; // クラス名



HICON LoadIcon(
 HINSTANCE hInstance,
 LPCTSTR lpIconName
);

事前に定義されたアイコンを使用するには、
hInstanceにNULLを設定し
lpIconNameに以下の値の1つを設定してください。

IDI_APPLICATIONDefault application icon.
IDI_ASTERISKSame as IDI_INFORMATION.
IDI_ERRORHand-shaped icon.
IDI_EXCLAMATIONSame as IDI_WARNING.
IDI_HANDSame as IDI_ERROR.
IDI_INFORMATIONAsterisk icon.
IDI_QUESTIONQuestion mark icon.
IDI_WARNINGExclamation point icon.
IDI_WINLOGOWindows logo icon. Windows XP: Default application icon.


HCURSOR LoadCursor(
 HINSTANCE hInstance,
 LPCTSTR lpCursorName
);

事前に定義されたカーソルを使用するためには、
hInstanceにNULLを設定し
lpCursorNameに以下の値の1つを設定してください。

IDC_APPSTARTINGStandard arrow and small hourglass
IDC_ARROWStandard arrow
IDC_CROSSCrosshair
IDC_HANDWindows 98/Me, Windows 2000/XP: Hand
IDC_HELPArrow and question mark
IDC_IBEAMI-beam
IDC_ICONObsolete for applications marked version 4.0 or later.
IDC_NOSlashed circle
IDC_SIZEObsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALLFour-pointed arrow pointing north, south, east, and west
IDC_SIZENESWDouble-pointed arrow pointing northeast and southwest
IDC_SIZENSDouble-pointed arrow pointing north and south
IDC_SIZENWSEDouble-pointed arrow pointing northwest and southeast
IDC_SIZEWEDouble-pointed arrow pointing west and east
IDC_UPARROWVertical arrow
IDC_WAITHourglass
Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

Windows Data Types

TermDescription
ATOMAtom.
typedef WORD ATOM;
BOOLBoolean variable (should be TRUE or FALSE)
typedef int BOOL;
BOOLEANBoolean variable (should be TRUE or FALSE)
typedef BYTE BOOLEAN;
BYTEByte (8 bits)
typedef unsigned char BYTE;
CALLBACKCalling convention for callback functions
#define CALLBACK __stdcall
CHAR8-bit Windows (ANSI) character.
typedef char CHAR;
COLORREFRed, green, blue (RGB) color value (32 bits).
typedef DWORD COLORREF;
CONSTVariable whose value is to remain constant during execution
#define CONST const
DWORD32-bit unsigned integer
typedef unsigned long DWORD;
DWORDLONG64-bit unsigned integer
typedef ULONGLONG DWORDLONG;
DWORD_PTRUnsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows. )
typedef ULONG_PTR DWORD_PTR;
DWORD3232-bit unsigned integer
typedef unsigned int DWORD32;
DWORD6464-bit unsigned integer
typedef unsigned __int64 DWORD64;
FLOATFloating-point variable
typedef float FLOAT;
HACCELHandle to an accelerator table
typedef HANDLE HACCEL;
HALF_PTRHalf the size of a pointer. Use within a structure that contains a pointer and two small fields
#ifdef _WIN64
typedef int HALF_PTR;
#else
typedef short HALF_PTR;
#endif
HANDLEHandle to an object
typedef PVOID HANDLE;
HBITMAPHandle to a bitmap
typedef HANDLE HBITMAP;
HBRUSHHandle to a brush
typedef HANDLE HBRUSH;
HCOLORSPACEHandle to a color space
#if(WINVER >= 0x0400)
typedef HANDLE HCOLORSPACE;
#endif
HCONVHandle to a dynamic data exchange (DDE) conversation
typedef HANDLE HCONV;
HCONVLISTHandle to a DDE conversation list
typedef HANDLE HCONVLIST;
HCURSORHandle to a cursor
typedef HICON HCURSOR;
HDCHandle to a device context (DC)
typedef HANDLE HDC;
HDDEDATAHandle to DDE data
typedef HANDLE HDDEDATA;
HDESKHandle to a desktop
typedef HANDLE HDESK;
HDROPHandle to an internal drop structure
typedef HANDLE HDROP;
HDWPHandle to a deferred window position structure
typedef HANDLE HDWP;
HENHMETAFILEHandle to an enhanced metafile
typedef HANDLE HENHMETAFILE;
HFILEHandle to a file opened by OpenFile, not CreateFile
typedef int HFILE;
HFONTHandle to a font
typedef HANDLE HFONT;
HGDIOBJHandle to a GDI object
typedef HANDLE HGDIOBJ;
HGLOBALHandle to a global memory block
typedef HANDLE HGLOBAL;
HHOOKHandle to a hook
typedef HANDLE HHOOK;
HICONHandle to an icon
typedef HANDLE HICON;
HINSTANCEHandle to an instance
typedef HANDLE HINSTANCE;
HKEYHandle to a registry key
typedef HANDLE HKEY;
HKLInput locale identifier
typedef HANDLE HKL;
HLOCALHandle to a local memory block
typedef HANDLE HLOCAL;
HMENUHandle to a menu
typedef HANDLE HMENU;
HMETAFILEHandle to a metafile
typedef HANDLE HMETAFILE;
HMODULEHandle to a module. The value is the base address of the module
typedef HINSTANCE HMODULE;
HMONITORHandle to a display monitor
if(WINVER >= 0x0500) typedef HANDLE HMONITOR;
HPALETTEHandle to a palette
typedef HANDLE HPALETTE;
HPENHandle to a pen
typedef HANDLE HPEN;
HRESULTReturn code used by interfaces. It is zero upon success and nonzero to represent an error code or status information
typedef LONG HRESULT;
HRGNHandle to a region
typedef HANDLE HRGN;
HRSRCHandle to a resource
typedef HANDLE HRSRC;
HSZHandle to a DDE string
typedef HANDLE HSZ;
HWINSTAHandle to a window station
typedef HANDLE WINSTA;
HWNDHandle to a window
typedef HANDLE HWND;
INT32-bit signed integer
typedef int INT;
INT_PTRSigned integer type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic
#if defined(_WIN64)
typedef __int64 INT_PTR;
#else
typedef int INT_PTR;
#endif
INT3232-bit signed integer
typedef signed int INT32;
INT6464-bit signed integer
typedef signed __int64 INT64;
LANGIDLanguage identifier.
typedef WORD LANGID;
LCIDLocale identifier.
typedef DWORD LCID;
LCTYPELocale information type.
typedef DWORD LCTYPE;
LGRPIDLanguage group identifier.
typedef DWORD LGRPID;
LONG32-bit signed integer
typedef long LONG;
LONGLONG64-bit signed integer
#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif
LONG_PTRSigned long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic
#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;
#endif
LONG3232-bit signed integer
typedef signed int LONG32;
LONG6464-bit signed integer
typedef __int64 LONG64;
LPARAMMessage parameter
typedef LONG_PTR LPARAM;
LPBOOLPointer to a BOOL
typedef BOOL far *LPBOOL;
LPBYTEPointer to a BYTE
typedef BYTE far *LPBYTE;
LPCOLORREFPointer to a COLORREF value
typedef DWORD *LPCOLORREF;
LPCSTRPointer to a constant null-terminated string of 8-bit Windows (ANSI) characters.
typedef __nullterminated CONST CHAR *LPCSTR;
LPCTSTRAn LPCWSTR if UNICODE is defined, an LPCSTR otherwise
#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
LPCVOIDPointer to a constant of any type
typedef CONST void *LPCVOID;
LPCWSTRPointer to a constant null-terminated string of 16-bit Unicode characters.
typedef CONST WCHAR *LPCWSTR;
LPDWORDPointer to a DWORD
typedef DWORD *LPDWORD;
LPHANDLEPointer to a HANDLE
typedef HANDLE *LPHANDLE;
LPINTPointer to an INT
typedef int *LPINT;
LPLONGPointer to a LONG
typedef long *LPLONG;
LPSTRPointer to a null-terminated string of 8-bit Windows (ANSI) characters.
typedef CHAR *LPSTR;
LPTSTRAn LPWSTR if UNICODE is defined, an LPSTR otherwise
#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif
LPVOIDPointer to any type
typedef void *LPVOID;
LPWORDPointer to a WORD
typedef WORD *LPWORD;
LPWSTRPointer to a null-terminated string of 16-bit Unicode characters.
typedef WCHAR *LPWSTR;
LRESULTSigned result of message processing
typedef LONG_PTR LRESULT;
PBOOLPointer to a BOOL
typedef BOOL *PBOOL;
PBOOLEANPointer to a BOOL
typedef BOOLEAN *PBOOLEAN;
PBYTEPointer to a BYTE
typedef BYTE *PBYTE;
PCHARPointer to a CHAR
typedef CHAR *PCHAR;
PCSTRPointer to a constant null-terminated string of 8-bit Windows (ANSI) characters.
typedef CONST CHAR *PCSTR;
PCTSTRA PCWSTR if UNICODE is defined, a PCSTR otherwise
#ifdef UNICODE
typedef LPCWSTR PCTSTR;
#else
typedef LPCSTR PCTSTR;
#endif
PCWSTRPointer to a constant null-terminated string of 16-bit Unicode characters.
typedef CONST WCHAR *PCWSTR;
PDWORDPointer to a DWORD
typedef DWORD *PDWORD;
PDWORDLONGPointer to a DWORDLONG
typedef DWORDLONG *PDWORDLONG;
PDWORD_PTRPointer to a DWORD_PTR
typedef DWORD_PTR *PDWORD_PTR;
PDWORD32Pointer to a DWORD32
typedef DWORD32 *PDWORD32;
PDWORD64Pointer to a DWORD64
typedef DWORD64 *PDWORD64;
PFLOATPointer to a FLOAT
typedef FLOAT *PFLOAT;
PHALF_PTRPointer to a HALF_PTR
#ifdef _WIN64
typedef HALF_PTR *PHALF_PTR;
#else
typedef HALF_PTR *PHALF_PTR;
#endif
PHANDLEPointer to a HANDLE
typedef HANDLE *PHANDLE;
PHKEYPointer to an HKEY
typedef HKEY *PHKEY;
PINTPointer to an INT
typedef int *PINT;
PINT_PTRPointer to an INT_PTR
typedef INT_PTR *PINT_PTR;
PINT32Pointer to an INT32
typedef INT32 *PINT32;
PINT64Pointer to an INT64
typedef INT64 *PINT64;
PLCIDPointer to an LCID
typedef PDWORD PLCID;
PLONGPointer to a LONG
typedef LONG *PLONG;
PLONGLONGPointer to a LONGLONG
typedef LONGLONG *PLONGLONG;
PLONG_PTRPointer to a LONG_PTR
typedef LONG_PTR *PLONG_PTR;
PLONG32Pointer to a LONG32
typedef LONG32 *PLONG32;
PLONG64Pointer to a LONG64
typedef LONG64 *PLONG64;
POINTER_3232-bit pointer. On a 32-bit system, this is a native pointer. On a 64-bit system, this is a truncated 64-bit pointer
#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER32
#endif
POINTER_6464-bit pointer. On a 64-bit system, this is a native pointer. On a 32-bit system, this is a sign-extended 32-bit pointer
Note that it is not safe to assume the state of the high pointer bit
#define POINTER_64 __ptr64
PSHORTPointer to a SHORT
typedef SHORT *PSHORT;
PSIZE_TPointer to a SIZE_T
typedef SIZE_T *PSIZE_T;
PSSIZE_TPointer to a SSIZE_T
typedef SSIZE_T *PSSIZE_T;
PSTRPointer to a null-terminated string of 8-bit Windows (ANSI) characters.
typedef CHAR *PSTR;
PTBYTEPointer to a TBYTE
typedef TBYTE *PTBYTE;
PTCHARPointer to a TCHAR
typedef TCHAR *PTCHAR;
PTSTRA PWSTR if UNICODE is defined, a PSTR otherwise
#ifdef UNICODE
typedef LPWSTR PTSTR;
#else typedef LPSTR PTSTR;
#endif
PUCHARPointer to a UCHAR
typedef UCHAR *PUCHAR;
PUHALF_PTRPointer to a UHALF_PTR
#ifdef _WIN64
typedef UHALF_PTR *PUHALF_PTR;
#else
typedef UHALF_PTR *PUHALF_PTR;
#endif
PUINTPointer to a UINT
typedef UINT *PUINT;
PUINT_PTRPointer to a UINT_PTR
typedef UINT_PTR *PUINT_PTR;
PUINT32Pointer to a UINT32
typedef UINT32 *PUINT32;
PUINT64Pointer to a UINT64
typedef UINT64 *PUINT64;
PULONGPointer to a ULONG
typedef ULONG *PULONG;
PULONGLONGPointer to a ULONGLONG
typedef ULONGLONG *PULONGLONG;
PULONG_PTRPointer to a ULONG_PTR
typedef ULONG_PTR *PULONG_PTR;
PULONG32Pointer to a ULONG32
typedef ULONG32 *PULONG32;
PULONG64Pointer to a ULONG64
typedef ULONG64 *PULONG64;
PUSHORTPointer to a USHORT
typedef USHORT *PUSHORT;
PVOIDPointer to any type
typedef void *PVOID;
PWCHARPointer to a WCHAR
typedef WCHAR *PWCHAR;
PWORDPointer to a WORD
typedef WORD *PWORD;
PWSTRPointer to a null- terminated string of 16-bit Unicode characters.
typedef WCHAR *PWSTR;
SC_HANDLEHandle to a service control manager database.
typedef HANDLE SC_HANDLE;
SC_LOCKLock to a service control manager database.
typedef LPVOID SC_LOCK;
SERVICE_STATUS_HANDLEHandle to a service status value.
typedef HANDLE SERVICE_STATUS_HANDLE;
SHORTShort integer (16 bits)
typedef short SHORT;
SIZE_TThe maximum number of bytes to which a pointer can point. Use for a count that must span the full range of a pointer
typedef ULONG_PTR SIZE_T;
SSIZE_TSigned SIZE_T
typedef LONG_PTR SSIZE_T;
TBYTEA WCHAR if UNICODE is defined, a CHAR otherwise
#ifdef UNICODE
typedef WCHAR TBYTE;
#else
typedef unsigned char TBYTE;
#endif
TCHARA WCHAR if UNICODE is defined, a CHAR otherwise
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
UCHARUnsigned CHAR
typedef unsigned char UCHAR;
UHALF_PTRUnsigned HALF_PTR. Use within a structure that contains a pointer and two small fields
#ifdef _WIN64
typedef unsigned int UHALF_PTR;
#else
typedef unsigned short UHALF_PTR;
#endif
UINTUnsigned INT
typedef unsigned int UINT;
UINT_PTRUnsigned INT_PTR
#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;
#endif
UINT32Unsigned INT32
typedef unsigned int UINT32;
UINT64Unsigned INT64
typedef usigned __int 64 UINT64;
ULONGUnsigned LONG
typedef unsigned long ULONG;
ULONGLONG64-bit unsigned integer
#if !defined(_M_IX86)
typedef unsigned __int64 ULONGLONG;
#else
typedef double ULONGLONG
#endif
ULONG_PTRUnsigned LONG_PTR
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif
ULONG32Unsigned LONG32
typedef unsigned int ULONG32;
ULONG64Unsigned LONG64
typedef unsigned __int64 ULONG64;
USHORTUnsigned SHORT
typedef unsigned short USHORT;
USNUpdate sequence number (USN)
typedef LONGLONG USN;
VOIDAny type
#define VOID void
WCHAR16-bit Unicode character.
typedef wchar_t WCHAR;
WINAPICalling convention for system functions
#define WINAPI __stdcall
WORD16-bit unsigned integer
typedef unsigned short WORD;
WPARAMMessage parameter
typedef UINT_PTR WPARAM;
Windows > データ型 | comments (0) | trackbacks (0)

WinMain()関数

int WINAPI WinMain(
 HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nCmdShow
);

hInstanceWinMain関数を実行しているアプリケーションそのものを表すインスタンスハンドルが格納されている。
hPrevInstance通常はNULLが格納されます。このパラメータは16ビットWindows時代に使われていたもので、Win32 APIでは利用する事はありません。
lpCmdLineコマンドライン引数で渡されたNULLで終わる文字列へのポインタ
nCmdShowウィンドウをどのように表示するべきかを指定した値が格納されています。


・hInstanceは、実行中のアプリケーションを識別する為の整数値(インスタンス・ハンドル)を受け取るものだが、現在の32ビットWindowsのシステム(Win32)では、どのアプリケーションを実行しても同じ値が渡されるので、この値を利用してアプリケーションを一意に識別する事は出来ない。しかし、APIの中にはアプリケーション自身を参照する為にこの値を引数にとるものがある。アプリケーションのあちこちで必要になる事があるので、グローバル変数に保存しておく場合も多い。
・hPrevInstanceもインスタンス・ハンドルだが、これはWindows3.1などの16ビットwindowsの互換性のために残っているものだ。16ビットWindowsでは、同じアプリケーションがすでに実行中である場合は、先に起動したアプリケーションのインスタンス・ハンドルがここに格納されるようになっていた。Win32では必ず0がセットされるので、利用価値はない。
・lpCmdLineはmain関数の2番目の引数(argv)と違ってパラメータごとに切り分けれれた形にはなってないため、必要なら自分で文字列を解析しなければならない。標準の機能ではないが、VisualC++では解析済みのパラメータが__argvというグローバル変数にセットされている。
Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

atoi/atol/atof

int atoi( const char *str )
long atol( const char *str )
double atof( const char *str )

atoi関数は文字列strをint型に変換して返す。
atol関数は文字列strをlong型に変換して返す。
atof関数は文字列strをdouble型に変換して返す。

i = atoi( str )

文字列strをint型に変換してint型変数iに代入する

l = atol( str )

文字列strをlong型に変換してlong型変数lに代入する

d = atof( str )

文字列strをdouble型に変換してdouble型変数dに代入する


#include <stdio.h>
#include <stdlib.h>
void main()
{
 int d;
 printf( "%d\n", d = atoi( " 100" ) );
 printf( "%d\n", d = atoi( " 100 234" ) );
 printf( "%d\n", d = atoi( "-200" ) );
 printf( "%d\n", d = atoi( "+200" ) );
 printf( "%d\n", d = atoi( "- 200" ) );
 printf( "%d\n", d = atoi( "300abc4" ) );
}


実行結果

100
100
-200
200
0
300


・先行する空白は無視される。
・'+'または'-'がある時は符合とされる。
・符号指定が省略された場合は'+'とみなされる。
・文字列に数字でない文字が現れたら、そこで変換を終了する
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

abs/labs/fabs

int abs( int n )
long labs( long n )
double fabs( double x )

abs関数はint型数値nの絶対値を返す。
labs関数はlong型数値nの絶対値を返す。
fabs関数はdouble型数値xの絶対値を返す。


printf( "%d\n", abs( -321 ) );
printf( "%ld\n", labs( -987654321 ) );
printf( "%4.2f\n", fabs( -23.4 ) );


実行結果

321
987654321
23.40

C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

div/ldiv

div_t div( int numer, int denom )
ldiv_t ldiv( long int numer, long int denom )

int型の引数を使用してdivを呼び出すと、
numer を denom で割り、商および剰余を求める。
商int quotおよび剰余int remで構成されるdiv_t型の構造体が返される。

ldiv関数は、引数および返される構造体のメンバがすべて
long int型である点を除いて、div関数と同じである。


div_t d;
d = div( 20, 6 );
printf( "商:%d 剰余:%d\n", d.quot, d.rem );


実行結果
商:3 剰余:2
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

fmod

double fmod( double x, double y )

浮動小数点数の剰余を計算する。

z = fmod( 10.5, 3.2 );

zは0.9になる。
C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

ceil/floor

double ceil( double x )
double floor( double x )

ceil関数は数値を切り上げる。
floor関数は数値を切り下げる。


printf( "%4.2f\n", ceil(12.11) );
printf( "%4.2f\n", ceil(-5.68) );


実行結果

13.00
-5.00




printf( "%4.2f\n", floor(12.11) );
printf( "%4.2f\n", floor(-5.68) );


実行結果

12.00
-6.00

C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

rand/srand

int rand( void )
void srand( unsigned int seed )

rand関数は0〜32767までの整数乱数値を発生させる。

単純にrand関数を使うと毎回同じ乱数列になる為
毎回異なる乱数列を得たい場合は
時間関数timeと乱数系列初期値設定関数srandを使い
次のように記述する。

srand( ( unsigned )time( NULL ) );


サンプル

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
 int i;
 srand( ( unsigned )time( NULL ) );

 // 0〜32767の整数乱数
 for ( i=0; i<=10; i++ ) printf( "%d\n", rand() );
 // 0〜1の実数乱数
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32767.0 );
 // 0〜1未満の実数乱数
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32767.1 );
 // このように書いているのもある
 for ( i=0; i<=10; i++ ) printf( "%f\n", rand() / 32768.0 );
 // 1〜6の整数乱数
 for ( i=0; i<=10; i++ ) printf( "%d\n", ( int )( ( rand() / 32767.1 * 6 ) + 1 ) );
 // これだと商が1.0の場合に7がでてしまう
 for ( i=0; i<=10; i++ ) printf( "%d\n", ( int )( ( rand() / 32767.0 * 6 ) + 1 ) );
}


以下のような式もあったりします。
( rand() % ( 上限 - ( 下限 ) + 1 ) ) + 下限

・0〜9の値
rand() % 10

・1〜6の値
( rand() % 6 ) + 1

・-3〜3の値
( rand() % 7 ) - 3
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

strcmp

int strcmp( const char *str1, const char *str2 )

文字列str1と文字列str2を比較し、以下の値を返す。
str1 と str2 の関係
< 0str1 は str2 より小さい
0str1 と str2 は等しい
> 0str1 は str2 より大きい



if ( strcmp( str, "aaa" ) == 0 ) {
 ・・・
}


もし文字列strが"aaa"なら処理をする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strcpy

char *strcpy( char *dest, const char *source )

文字列destに文字列sourceをコピーする

strcpy( s, "strcpy test" );

文字配列sに"strcpy test"をコピーする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

qsort

void qsort( void *base, size_t num, size_t width
, int ( __cdecl *compare )( const void *, const void * ) )


widthに指定したバイト数の要素num個から成る配列baseを並べ替える。
base引数は、並べ替える配列のベースへのポインタである。
引数compareは、比較関数へのポインタである。
qsort 関数は、並べ替えの間に次のcompareルーチンを1回または複数回呼び出し、
そのたびに2つの配列要素へのポインタを渡す。
qsort関数は、並べ替えた後の要素で、この配列を上書きする。

比較関数はユーザーが自作する。
また、qsort関数の第4引数に示された仕様でなければならない。

比較関数は、要素を比較し、次のいずれかの値を返すこと。
< 0昇順:elem1はelem2より小さい、降順:elem1はelem2より大きい
0elem1 は elem2 に等しい
> 0昇順:elem1はelem2より大きい、降順:elem1はelem2より小さい



#include
#include // qsort用
#include // strcmp用

int intcmp( const void *, const void * );
int intrcmp( const void *, const void * );
int dblcmp( const void *, const void * );
int mystrcmp( const void *, const void * );

void main()
{
 int id[10] = { 45, 65, 23, 87, 53, 67, 32, 19, 73, 66 };
 double dd[10] = { 3.56, 7.43, 5.76, 3.67, 9.65, 5.64, 2.75, 4.55, 6.32, 4.78 };
 char *pstr[5] = { "apple", "orange", "banana", "lemon", "peach" };
 int i;

 printf( "--int昇順--\n" );
 qsort( id, 10, sizeof( int ), intcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--int降順--\n" );
 qsort( id, 10, sizeof( int ), intrcmp );
 for ( i=0; i<10; i++ ) printf( "%d ", id[i] );
 puts( "\n" );

 printf( "--double昇順--\n" );
 qsort( dd, 10, sizeof( double ), dblcmp );
 for ( i=0; i<10; i++ ) printf( "%4.2f ", dd[i] );
 puts( "\n" );

 printf( "--文字列昇順--\n" );
 qsort( pstr, 5, sizeof( char* ), mystrcmp );
 for ( i=0; i<5; i++ ) printf( "%s ", pstr[i] );
 puts( "\n" );

}

int intcmp( const void *a, const void *b )
{
 return( *(int*)a - *(int*)b );
}

int intrcmp( const void *a, const void *b )
{
 return( *(int*)b - *(int*)a );
}

int dblcmp( const void *a, const void *b )
{
 if ( *(double*)a < *(double*)b )
  return -1;
 else if ( *(double*)a == *(double*)b )
  return 0;
 else
  return 1;
}

int mystrcmp( const void *a, const void *b )
{
 return strcmp( *(char**)a, *(char**)b );
}


実行結果

--int昇順--
19 23 32 45 53 65 66 67 73 87

--int降順--
87 73 67 66 65 53 45 32 23 19

--double昇順--
2.75 3.56 3.67 4.55 4.78 5.64 5.76 6.32 7.43 9.65

--文字列昇順--
apple banana lemon orange peach


自作する比較関数ですが、古いテキストの記述方法だと蹴られまくりました。
恐るべし。
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)