MW211 EXIT

devlog
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
PHP/タイムスタンプ型(2)
2012年07月07日
┌──────────────────────────────────────┐
│echo strtotime('1 day', 0);                                                 │
└──────────────────────────────────────┘
ってやると、結果は「86400」。

┌──────────────────────────────────────┐
│echo date('Y/m/d H:i:s', strtotime('1 day', 0))                             │
└──────────────────────────────────────┘
ってやると、既定を日本時間にしてると「1970/01/02 09:00:00」とかとなって
なんだかわけがわからなくなるが、「1970/01/02 00:00:00」のことで
しっかりスタートから一日分加算されているのだ。

ということで、つ・ま・り…、あのn日後とかの日付計算ができるってわけ。

┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += strtotime('1 day', 0);                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘
これで1日進められる。

┌──────────────────────────────────────┐
│$timestamp += (strtotime('+1 day') - time());                               │
└──────────────────────────────────────┘
やった!これみたいなまわりくどいことをしなくてもよくなった!

ただね、月に関しては相変わらずダメ。
┌──────────────────────────────────────┐
│echo strtotime('1 month', 0);                                               │
└──────────────────────────────────────┘
この結果が「2678400=31日×86400秒」でつまり、31日固定のようだ。
ま、1970年の01月は31日あるもんね。

ちなみに1ヶ月ずらしてみると…。
┌──────────────────────────────────────┐
│echo strtotime('1 month', 2678400) - strtotime('1 month', 0);               │
└──────────────────────────────────────┘
結果は「2419200=28日×86400秒」。やはり2月で28日(うるう年じゃないし)となる。
分類:PHP
PHP/タイムスタンプ型(1)
2012年07月06日
タイプスタンプ型は要は「1秒を1とする整数」みたいなもんだから、
「1」を加算すれば、1秒進められる。
┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += 1;                                                            │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘

「24時間×60分×60秒」(=86400)を足してあげれば、一日進めることができる。
┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += 24 * 60 * 60;                                                 │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘

日数を計算する上では毎日均等だからいいけど(※)、
月を計算する時には31日の月とか30日の月とかあるからややこしい。
これらを「mktime()」とかが楽チンに計算してくれるわけだ。

※「うるう秒」ってどうなってんだろう。。。
分類:PHP
PHP/【訂正】タイムスタンプ型の値を1ヶ月後にする方法
2012年07月05日
先日1ヶ月後の日時を求める簡単な方法で以下を紹介しましたが、
┌──────────────────────────────────────┐
│$timestamp += (strtotime('+1 month') - time());                             │
└──────────────────────────────────────┘
これだと、これを実行した現在月により加算される日数が
31日だったり、30日だったりして、うまくいかないことが判明しました。

9月に8月1日の変数で上記を実行すると、結果は8月31日になってしまうわけです。

やっぱり、mktime()使って地道にやるのが一番の近道かも。
┌──────────────────────────────────────┐
│$timestamp = mktime(date('H', $timestamp),      // 時                       │
│                    date('i', $timestamp),      // 分                       │
│                    date('s', $timestamp),      // 秒                       │
│                    date('m', $timestamp) + 1,  // 月                       │
│                    date('d', $timestamp),      // 日                       │
│                    date('Y', $timestamp));     // 年                       │
└──────────────────────────────────────┘
分類:PHP
PHP/ゼロサプレイスと8進数(3)
2012年07月04日
気になったのでいろいろvar_dump()してみた。

「var_dump(010)」          →「int(8)」
「var_dump('010')」        →「string(3) "010"」
「var_dump('010' + 0)」    →「int(10)」
「var_dump('010' + '010')」→「int(20)」

やっぱり、数値の「010」は8進数の8で、
文字列の「010」はあくまで文字列で数値に変換する時は
10進数に変換するようだ。
分類:PHP
PHP/ゼロサプレイスと8進数(2)
2012年07月03日
ところで、1月1日を「date('md')」にすれば「0101」だよね。
これに、「7」とか足したら繰り上がって「0110」とかになるのかな?

結果は、「108」。
う~ん、「date('md')」の「0101」はあくまで文字列で
(変数に代入してvar_dump()するとstring型だとわかる)、
数値型8進数ではないようだ
ちなみに、「010」を変数に代入してvar_dump()すると、int型だけど
すでに「8」って扱いになってしまっている。

結論としては、「intval('010')」の結果が「10」になるのと同じってことだね。

「var_dump('010' + '010');」→「int(20)」でした。
分類:PHP
PHP/ゼロサプレイスと8進数(1)
2012年07月02日
整理整頓好きのゼロサプレイスの敵といったら8進数だ。
3桁の中に2桁が混じっているので、ゼロサプレイスして「010」とかした日には
8進数の「10」と認識されて(10進数の)「8」とかにされてしまう。

ところで、時間関係の関数で「date('d')」のように、
ゼロサプレイスしてくれるものがある。
これって、「07」日とかで、「+1」日後にしたら、
「010」日つまり「8」日とかになってしまったりするのでは…
…あっ、7日の次は8日だね。
問題ないというオチでした。。。
そりゃ「+10」日後を「+010」日後にしたりすりゃ8日後になりますけどね。
分類:PHP
前へ 1 2 3 4 次へ