MW211 EXIT

devlog
PHP/parse_ini_fileの注意点(2)
2012年07月17日
PHPでは「parse_ini_file()」を使ってiniファイルを解析したりするが、
この場合、以下の注意が必要。

iniファイルでは「?{}|&~![()^"」が使えないらしい。
分類:PHP
PHP/parse_ini_fileの注意点(1)
2012年07月16日
PHPでは「parse_ini_file()」を使ってiniファイルを解析したりするが、
この場合、以下の注意が必要。

・以下の文字列は「文字列""」と認識される(大文字のみ、大文字混在も含む)
    false、no、none、null、off
・以下の文字列は「文字列"1"」と認識されるもの(大文字のみ、大文字混在も含む)
    on、true、yes

なお、「one」みたいに文字列の一部の場合は「1e」とかにはならないから大丈夫。

ということで、「FLAG=true」とか指定した場合には、
「配列['セクション']['FLAG']="1"」みたいな感じになる。

ただし、「if (配列['セクション']['FLAG']) {…} else {…}」(…①)って
判定してしまえば、trueの場合は真の処理を、falseの場合は偽の処理をしてくれる。

間違って「if (配列['セクション']['FLAG'] === 'true') {…」とかやると
ハマってしまう(trueを指定しても偽になってしまう)。

ただ、①の場合、「hoge」とかでも(何らかの文字があれば)、真になってしまうので、
trueかfalseのどちらかを厳密に指定するように推奨した方がよいかも。
(ちなみに指定なし(FLAG=)だと偽になる)
分類:PHP
PHP/定義済み定数一覧
2012年07月15日
┌──────────────────────────────────────┐
│print_r(get_defined_constants());                                           │
└──────────────────────────────────────┘
お、多い…。

ちょっと乱暴すぎるのでソートする場合は以下のような感じで。
┌──────────────────────────────────────┐
│$define = get_defined_constants();                                          │
│ksort($define);                                                             │
│foreach ($define as $key => $value) {                                       │
│  printf("%s = %s\n", $key, $value);                                        │
│}                                                                           │
└──────────────────────────────────────┘
でも、お、多い。。。
分類:PHP
VC++/ファイルの最終行を検出する方法
2012年07月14日
C言語であれば以下のような感じか。
┌──────────────────────────────────────┐
│FILE  fp;                                                                   │
├──────────────────────────────────────┤
│while (fgets(line, sizeof(line), fp) != NULL) {                             │
│}                                                                           │
│if (ferror(fp)) {                                                           │
│    エラー;                                                                 │
│}                                                                           │
└──────────────────────────────────────┘
ファイルの最後になったらlineを書き換えないので、最後のlineが残っている。

MFCであれば、以下のような感じ。
┌──────────────────────────────────────┐
│CStdioFile  ファイル;                                                       │
├──────────────────────────────────────┤
│CString     line    = "";                                                   │
│CString     newLine = "";                                                   │
│while (ファイル.ReadString(newLine)) {                                      │
│    line = newLine;                                                         │
│}                                                                           │
└──────────────────────────────────────┘
但し、こちらはline(newLine)を書き換えてしまうため、
ワンクッション必要みたい。
VC++/CArrayについて
2012年07月13日
┌──────────────────────────────────────┐
│CArray a;                                                                   │
└──────────────────────────────────────┘
CArrayにて、以下は同じ。(三番目の項目をみている)
┌──────────────────────────────────────┐
│a[3]                                                                        │
├──────────────────────────────────────┤
│a.GetAt(3)                                                                  │
└──────────────────────────────────────┘
分類:C/C++
C言語/グローバル変数の定義
2012年07月12日
以下の組み合わせなら、OK。
┌──┬───────────────────────────────────┐
│a.h │int z;                                                                │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
├──┼───────────────────────────────────┤
│b.h │int z;                                                                │
├──┼───────────────────────────────────┤
│b.c │#include "b.h";                                                       │
└──┴───────────────────────────────────┘

以下の組み合わせだと、二重定義でNG。
┌──┬───────────────────────────────────┐
│a.h │int z;                                                                │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
│    │#include "b.h";                                                       │
├──┼───────────────────────────────────┤
│b.h │int z;                                                                │
└──┴───────────────────────────────────┘

以下も、二重定義でNG。
┌──┬───────────────────────────────────┐
│a.h │int z;                                                                │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
│    │#include "b.h";                                                       │
├──┼───────────────────────────────────┤
│b.h │#include "a.h";                                                       │
└──┴───────────────────────────────────┘

以下ならOK。
┌──┬───────────────────────────────────┐
│a.h │int z;                                                                │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
│    │#include "b.h";                                                       │
├──┼───────────────────────────────────┤
│b.h │extern int z;                                                         │
└──┴───────────────────────────────────┘

以下だと、実体がなくなってしまうのでNG。
┌──┬───────────────────────────────────┐
│a.h │extern int z;                                                         │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
│    │#include "b.h";                                                       │
├──┼───────────────────────────────────┤
│b.h │#include "a.h";                                                       │
└──┴───────────────────────────────────┘

以下とかもありがちなのか?
┌──┬───────────────────────────────────┐
│a.h │                                                                      │
├──┼───────────────────────────────────┤
│a.c │#include "a.h";                                                       │
│    │int z;                                                                │
├──┼───────────────────────────────────┤
│b.h │extern int z;                                                         │
├──┼───────────────────────────────────┤
│b.c │#include "a.h";                                                       │
│    │#include "b.h";                                                       │
└──┴───────────────────────────────────┘

よくわからん。そのうちちゃんと整理します。(上記はあまり信用しないでね)
分類:C/C++
C++/【未解決】書式付文字列結合
2012年07月11日
PHPだと書式に変換した文字列を結合するのはたやすい。
┌──────────────────────────────────────┐
│$a  = 'Kato';                                                               │
│$a .= sprintf('%d', 123);                                                   │
│$a .= sprintf('%d', 9);                                                     │
├──────────────────────────────────────┤
│echo $a;                                                        →'Kato1239'│
└──────────────────────────────────────┘

だからついCでも「sprintf()」の戻り値は編集後の文字列だと錯覚してしまうが
戻り値は処理結果(成功したか)であって、「sprintf(a, '%d', 123)」みたいに
編集後の文字列を取得する変数は、第一引数にねじ込まなければならない。

さて、MFC(Visual C++)において、CString型でFormatというメソッドがあるが
上記を再現すると、以下のようになってしまい、二倍の行を費やしてしまう
┌──────────────────────────────────────┐
│CString a, b;                                                               │
│a = 'Kato'                                                                  │
│b.Format("%d", 123);                                                        │
│a += b;                                                                     │
│b.Format("%d", 9);                                                          │
│a += b;                                                                     │
└──────────────────────────────────────┘

例えば、以下のようにすると、編集後のbが代入されるのではなく
bを編集した結果(成功したか)が代入されるみたい。
┌──────────────────────────────────────┐
│a += b.Format("%d", 123);                                                   │
└──────────────────────────────────────┘

また、こんな風に自己循環させるのもダメらしい。
┌──────────────────────────────────────┐
│a.Format("%s%d", a, 123);                                                   │
└──────────────────────────────────────┘

なんか、一行で書けるうまいてはないものか?(やっぱりユーザ関数?)
分類:C/C++、【未解決】
C++/静的メンバ変数の使い方
2012年07月10日
例えば、設定ファイルに決まった設定値があって、
一度読んでしまえば後はずっと同じで、それをクラスで共通的に使う場合。

こいつをクラス生成時のコンストラクタの引数に代入して使ったりする。

でも、毎回毎回クラスを生成するたんびにコンストラクタに代入するのもちょっと。

そんな時には静的なメンバ変数を使ってしまおう…って、それでいいのか?

でも、使う使わないは別として、使い方は知っておきたい。

以下の通りのようだ。

(1) クラスのメンバ変数を静的なパブリック属性として定義する。
┌──────────────────────────────────────┐
│class クラス                                                                │
│{                                                                           │
│public:                                                                     │
│    int32_t  メンバ変数;                                                    │
│}                                                                           │
└──────────────────────────────────────┘

(2) このクラスを使う側のクラスのグローバル領域で、同じ型で宣言する。
┌──────────────────────────────────────┐
│int32_t  クラス::メンバ変数;                                                │
└──────────────────────────────────────┘

(3) クラスを生成する前に値を代入する。
┌──────────────────────────────────────┐
│クラス::メンバ変数 = 値が決定した変数;                                      │
│while () {                                                                  │
│    ポインタ = new クラス();                                                │
│    delete ポインタ;                                                        │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++
PHP/タイムスタンプ型(4)うるう秒
2012年07月09日
うるう秒ってあるよね(って途中で思い出した)。

どうなんだろうと思って、40年後あたりの日時を出してみた。
┌──────────────────────────────────────┐
│echo date('Y/m/d H:i:s', 40 * 365 * 86400);            →2009/12/22 09:00:00│
└──────────────────────────────────────┘
12月31日じゃないのはうるう年の関係だから気にしないとして、
気にするのは分と秒。
1972年~2009年で、24秒うるう秒があるらしい。

まったく反映されていない、きれいな00分00秒です。(9時ってのは例によって日本時間)

基本的に反映しないものらしいね。反映したらややこしいし。

なんか調べてたら「strptime()」とかにぶち当たったが、またそれは別の話。
分類:PHP
PHP/タイムスタンプ型(3)
2012年07月08日
1970年01月換算で1月=31日と、1970年02月換算で1月=28日になる
分水嶺をみつけたくなった。

地道に値が変わるところを調べた結果、以下で値が変わった。
┌──────────────────────────────────────┐
│echo (strtotime('1 month', 86400 * 30 + 53999) - (86400 * 30 + 53999));     │
│echo (strtotime('1 month', 86400 * 30 + 54000) - (86400 * 30 + 54000));     │
└──────────────────────────────────────┘
てっきり「86400 * 31±1」かなと思っていただけに意外だった。

1月30日+何か。いったい、なんだろう?

で、文字列に再変換。
┌──────────────────────────────────────┐
│echo date('Y/m/d H:i:s', 86400 * 30 + 53999);          →1970/01/31 23:59:59│
│echo date('Y/m/d H:i:s', 86400 * 30 + 54000);          →1970/02/01 00:00:00│
└──────────────────────────────────────┘
………。ローカル時間を日本時間にしていたから値が違うだけで、
結局1/31と2/1の間だったのね(ちゃんとローカル時間を考慮してくれてるんだ)。

結論、「strtotime('1 month')」は、その第二引数でしているする
基準時間の月数で31日や30日に変化する。
第二引数はたいてい省略し、現在時刻となるので現在月が反映されやすい。
ローカル時間をちゃんと考慮してくれる。
う~ん、いろいろわかった。
分類:PHP
前へ 1 … 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 … 156 次へ