blog.ishinao.net

89月/05

ジョグダイアルが完全に死んだ (19:07)

何をやってもびた一文反応しなくなってしまった。今のところ、今週末にW31CAに買い換える予定。Suica初代機に乗り換えるのはあきらめた。

このエントリーを含むはてなブックマークはてなブックマーク - ジョグダイアルが完全に死んだ (19:07) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments
89月/05

なんじゃこりゃ (17:07)

iTunes 5にアップデートしようとしたら、QuickTimeを7にアップデートしてもいいか聞いてきた。俺はQuickTime 6のProライセンスを持っているので、それが使えなくなるのはいやだから、「いいえ」を選択した。すると、インストールを中止するか聞いてきたので、QuickTimeのアップデートはしたくないけど、iTunesのインストールはしたかったので、「いいえ」を選択した。するとふつうにiTunesのセットアッププログラムが立ち上がったので、そのままインストール作業を続行した。すると、先ほど拒否したはずのQuickTimeも含めてインストールが行われ、QuickTimeはバージョン7にアップグレードされ、俺のQuickTime 6 Proのライセンスは失われた。なんじゃそりゃ。これってダウングレードできるのかなー。

このエントリーを含むはてなブックマークはてなブックマーク - なんじゃこりゃ (17:07) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments
89月/05

今日のスポクラ (16:19)

朝からPHPのリファレンスのテストをごちゃごちゃやっていたら、スポクラに行くのが10分ほど遅れてしまった。んで、マシンは今日は7割程度に省略。昨日今日とやたら汗をかくのはやっぱりVAAM缶のせいかな。それとも気候か体質の問題?

このエントリーを含むはてなブックマークはてなブックマーク - 今日のスポクラ (16:19) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments
89月/05

やっぱりダメだった (11:39)

リファレンス変数の動作イメージがきちんと理解できていないな。配列と絡むとさらに混乱度倍。

要は、

function &getNode(&$tree, $path)
{
$node =& $tree;
foreach (explode('/', $path) as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
return $node;
}
function setNode(&$tree, $path, $value)
{
$node =& getNode($tree, $path);
$node = $value;
}
function setNodeByRef(&$tree, $path, &$value)
{
$node =& getNode($tree, $path);
$node =& $value;
}
$tree = array(
1 => array(
11 => 11,
12 => 12,
),
2 => array(
21 => 21
),
);
$a = 'a';
print_r($tree);
setNode($tree, '1/11', $a);
print_r($tree);
setNodeByRef($tree, '1/12', $a);
print_r($tree);
$a = 'A';
print_r($tree);

なんてことをしたかったんだけど、これだとsetNodeByRefしても、指定したノードに$aのリファレンスが代入されない。

function setNodeByRef(&$tree, $path, &$value)
{
$node =& $tree;
$keys = explode('/', $path);
$lastkey = array_pop($keys);
foreach ($keys as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
$node[$lastkey] =& $value;
}

みたいにすれば大丈夫だけど。

このエントリーを含むはてなブックマークはてなブックマーク - やっぱりダメだった (11:39) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments
89月/05

リファレンスをよく分かっていなかった (10:02)

$x = 'x';
$tmp =& $x;
$tmp = 'X';
echo 'x = ' . $x . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$tmp =& $x;
unset($tmp);
$tmp = 'X';
echo 'x = ' . $x . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$y = 'y';
$tmp =& $x;
$tmp =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$y = 'y';
$tmp =& $x;
$x =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";

の結果を正しく理解していなかった模様。この辺の理解が曖昧なままに、配列の要素のリファレンスをいじっていて混乱してしまった。

ああ、肝心なパターンが抜けていた

$x = 'x';
$y = 'y';
$tmp =& $x;
$tmp =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";

ね。リファレンス変数にリファレンスを代入した場合の影響範囲。
ちなみに上記の結果は、

x = z
y = z
tmp = z

になる。

すみません、間違いでした

ISAさんにコメントで指摘された通り、前のテストコードで設定したリファレンスを引きずっちゃってました。正しくは、

x = x
y = z
tmp = z

でした。

$tmp =& $x;
$tmp =& $y;

で、$x、$y、$tmpのすべてが同じシンボルテーブルを参照するようになるんだと勘違いしていた。やっぱりわかってないなー。

このエントリーを含むはてなブックマークはてなブックマーク - リファレンスをよく分かっていなかった (10:02) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments