MW211 EXIT

devlog
C/C99定義の基本型代替型一覧
2014年06月15日
┌─────┬────────────────────────────────┐
│char_t    │○char                                                          │
├─────┼────────────────────────────────┤
│int8_t    │○signed char                                                   │
├─────┼────────────────────────────────┤
│uint8_t   │○unsigned char                                                 │
├─────┼────────────────────────────────┤
│int16_t   │○short               (signed short)                            │
│          │△int                 (signed int)                              │
├─────┼────────────────────────────────┤
│uint16_t  │○unsigned short                                                │
│          │△unsigned int                                                  │
├─────┼────────────────────────────────┤
│int32_t   │○long                (signed long)                             │
│          │○int                 (signed int)                              │
├─────┼────────────────────────────────┤
│uint32_t  │○unsigned long                                                 │
│          │○unsigned int                                                  │
├─────┼────────────────────────────────┤
│int64_t   │○long long           (signed long long)                        │
│          │△long                (signed long)                             │
├─────┼────────────────────────────────┤
│uint64_t  │○unsigned long long                                            │
│          │△unsigned long                                                 │
├─────┼────────────────────────────────┤
│float32_t │○float                                                         │
├─────┼────────────────────────────────┤
│float64_t │○double                                                        │
└─────┴────────────────────────────────┘
分類:C/C++
VC++/CTime型の大小比較
2014年05月22日
「if (CTime型変数 < "2014年01月02日12時34分50秒")」的なことをしたい場合は、
CTime型の定数を作ってもよいが、以下のようにベタで書くこともできる。
┌──────────────────────────────────────┐
│if (CTime型変数 < CTime(2014, 1, 2, 12, 34, 50)) {                          │
│    // 2014年01月02日12時34分50秒より前の場合                               │
│} else {                                                                    │
│    // 2014年01月02日12時34分50秒以降の場合                                 │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++
VC++/疑似例外
2014年05月12日
疑似的例外を発生させるには「throw」してあげればよい。
┌──────────────────────────────────────┐
│try {                                                                       │
│    throw("例外だよ");  // 疑似例外                                         │
│} catch(const char* str) {                                                  │
│    // 例外処理                                                             │
│}                                                                           │
└──────────────────────────────────────┘
但し、これは文字型の場合。
「CException」型だとめんどくさい。

で、これを簡単にやってくれるのが「AfxThrowUserException()」。
┌──────────────────────────────────────┐
│try {                                                                       │
│    AfxThrowUserException();  // 疑似例外                                   │
│} catch(CException *e) {                                                    │
│    // 例外処理                                                             │
│}                                                                           │
└──────────────────────────────────────┘
「不明なエラーが発生しました。」っていうメッセージで例外を起こしてくれる。

但し、初期化処理「AfxWinInit()」実行後から使用可なので注意のこと。
分類:C/C++
C言語/落とし穴シリーズ(1)
2013年12月16日
┌──────────────────────────────────────┐
│if (!(変数 == 値)) {                                                        │
└──────────────────────────────────────┘
という条件文を書こうとしたけど、うっかり括弧を書き損ねた場合。
┌──────────────────────────────────────┐
│if (!変数 == 値) {                                                          │
└──────────────────────────────────────┘

優先順位の関係で、以下のように解釈されるらしい。
┌──────────────────────────────────────┐
│if ((!変数) == 値) {                                                        │
└──────────────────────────────────────┘

変数が「int型」だったりした場合、「!」演算で「bool型」扱いとなるため
キャストが発生する(Warningが発生するかも)。
分類:C/C++
VC++/再頒布可能パッケージ
2013年10月18日
「Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)」ってのがある。

「Visual C++で開発されたアプリケーションを
  Visual C++ 2010がインストールされていないコンピューター上で
  実行するために必要な、Visual C++ライブラリの
  ランタイムコンポーネントをインストールします。」

ってことらしい。

「vcredist_x86.exe」ってのを、マイクロソフトのサイトからダウンロードして
インストールすればよいらしい。
分類:C/C++
C言語/memcpy()の注意点
2013年09月12日
┌──────────────────────────────────────┐
│memcpy(コピー先のアドレス, コピー元のアドレス, サイズ);                     │
└──────────────────────────────────────┘
「memcpy()」は、コピー先をコピー元で潰すイメージがあるので、
コピー先のサイズを超えてコピーしないか常に注意しがちだ。
(もちろん、それをやってしまうと例外が発生する)
ということで、「コピー先のサイズ≧サイズ」は常にチェックするだろう。
しかし、潰されないコピー元も、関係ないところを参照することになると
こちらも例外が発生する。
「コピー元のサイズ≧サイズ」も常に意識しなければならないのだ。
これは結構盲点だ。
分類:C/C++
C/ファイルがいっぱい時の書込エラー
2013年08月20日
ファイルがいっぱいになった時の書込エラーは「fwrite()」ではなく
「fclose()」(失敗時は戻り値≠0)で発生する。

「fflush()」するのが「fwrite()」ではなく「fclose()」なので
当たり前の話だが、見落としがちだ。
分類:C/C++
C/排他制御と書込オープン
2013年07月01日
「w」もしくは「w+」でfopen()する場合、
排他制御を「flock()」で行うと、「fopen()」→「flock()」の順なので
「flock()」前に更新(全クリア)が発生してしまい、うまく排他制御ができない。

「open()」のレベルで考えると、全クリアは「O_TRUNC」モード指定が該当する。
つまり、以下のような感じとなる。
┌──────────────────────────────────────┐
│fd = open(ファイル名,                                                       │
│          モード | O_TRUNC,                                                 │
│          権限);                                                            │
├──────────────────────────────────────┤
│if (flock(fd, LOCK_EX) == -1) {                                             │
│    排他制御中                                                              │
│}                                                                           │
└──────────────────────────────────────┘

この場合は、全クリアを「ftruncate()」にまかせて
「open()」の時点では全クリアをしないようにするのが鉄則ということだ。
┌──────────────────────────────────────┐
│fd = open(ファイル名,                                                       │
│          モード,                                                           │
│          権限);                                                            │
├──────────────────────────────────────┤
│if (flock(fd, LOCK_EX) == -1) {                                             │
│    排他制御中                                                              │
│}                                                                           │
├──────────────────────────────────────┤
│ftruncate(fd, 0);                                                           │
└──────────────────────────────────────┘
分類:C/C++
C言語/規格の歴史
2013年06月26日
┌──┬───────────────────────────────────┐
│K&R │書籍「The C Programming Language」(K&R)が事実上の標準     (1978年出版)│
├──┼───────────────────────────────────┤
│C89 │・関数プロトタイプの導入                                              │
│C90 │・void型、enum型の追加                                                │
│    │「ANSI C89」「ISO C90」とも呼ばれ、「JIS X3010-1993」が該当           │
├──┼───────────────────────────────────┤
│C95 │・ワイド文字版ライブラリを追加                                        │
├──┼───────────────────────────────────┤
│C99 │・変数宣言位置の自由化(ブロック先頭でなくてもよい)                    │
│    │・論理型(_Bool型)の追加「stdbool.h」                                  │
│    │・複素数の追加「complex.h」                                           │
│    │・64ビット整数値(「long long int 型」)の追加                          │
│    │・「//」コメントの導入                                                │
│    │・インライン関数の導入                                                │
│    │・可変長配列の導入                                                    │
│    │「JIS X 3010:2003」が該当                                             │
├──┼───────────────────────────────────┤
│C11 │最新規格                                                              │
│    │・「gets()」関数の廃止                                                │
│    │・Unicode文字列の標準対応                                             │
│    │・type-generic式の導入                                                │
│    │・無名構造体・無名共用体の導入                                        │
│    │・排他的アクセスによるファイルオープン方法の実装                      │
│    │・_Noreturn関数指示子の導入(スタックを消費しない関数)                 │
└──┴───────────────────────────────────┘
分類:C/C++
C言語/fcntl()による排他制御・実例
2013年06月08日
読込系処理で共有ロックをかける場合の処理の流れ
┌──────────────────────────────────────┐
│int           fd;                                                           │
│struct flock  ファイルロック構造体;                                         │
├──────────────────────────────────────┤
│fd = open(ファイル名,                                                       │
│          O_RDONLY,                                // 読込専用でオープンする│
│          0444);                                                            │
│if (fd == -1) {                                                             │
│    オープン失敗;                                                           │
│    exit(EXIT_FAILURE);                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│ファイルロック構造体.l_type   = F_RDLCK;                       // 共有ロック│
│ファイルロック構造体.l_whence = SEEK_SET;                                   │
│ファイルロック構造体.l_start  = 0;                                          │
│ファイルロック構造体.l_len    = 16;                                         │
│戻り値 = fcntl(fd,                                                          │
│               F_SETLK,                                    // ロックをかける│
│               &ファイルロック構造体);                                      │
│if (戻り値 == -1) {                                                         │
│    他でロック中を検出;                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│読込処理など                                                                │
├──────────────────────────────────────┤
│close(fd);                                             // アンロックも兼ねる│
└──────────────────────────────────────┘
・ファイル先頭から16バイト分の領域についてロックを行う
────────────────────────────────────────
書込系処理で排他ロックをかける場合の処理の流れ
┌──────────────────────────────────────┐
│int           fd;                                                           │
│struct flock  ファイルロック構造体;                                         │
├──────────────────────────────────────┤
│fd = open(ファイル名,                                                       │
│          O_RDWR,                                  // 読書両用でオープンする│
│          0666);                                                            │
│if (fd == -1) {                                                             │
│    オープン失敗;                                                           │
│    exit(EXIT_FAILURE);                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│ファイルロック構造体.l_type   = F_WRLCK;                       // 排他ロック│
│ファイルロック構造体.l_whence = SEEK_SET;                                   │
│ファイルロック構造体.l_start  = 0;                                          │
│ファイルロック構造体.l_len    = 16;                                         │
│戻り値 = fcntl(fd,                                                          │
│               F_SETLK,                                    // ロックをかける│
│               &ファイルロック構造体);                                      │
│if (戻り値 == -1) {                                                         │
│    他でロック中を検出;                                                     │
│}                                                                           │
├──────────────────────────────────────┤
│書込処理など                                                                │
├──────────────────────────────────────┤
│close(fd);                                             // アンロックも兼ねる│
└──────────────────────────────────────┘
・ファイル先頭から16バイト分の領域についてロックを行う
分類:C/C++
前へ 1 2 3 4 5 6 7 8 9 次へ