カテゴリー
C++ PHP

Windows 用 PHP 拡張モジュールコンパイル時のエラー

1>—— ビルド開始: プロジェクト:php_xxxxx, 構成:Release Win32 ——
1> php_xxxxx.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xkeycheck.h(199): warning C4005: ‘inline’ : マクロが再定義されました。
1> C:\php-sdk\phpdev\vc11\x86\php-5.5.32-src\Zend/zend_config.w32.h(74) : ‘inline’ の前の定義を確認してください
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xkeycheck.h(242): fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.

ビルドに使用した環境:
Microsoft(R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
(Visual Studio 2012 Update 5)

上記障害、プリプロセッサ指令に下記のマクロを添えることにより解決した:
ZEND_WIN32_FORCE_INLINE

カテゴリー
PHP プログラミング

お巡りさんの必要人数を求める

子供が小学6年生で、算数で数列を学んでいます。課題で次のような問題が出されました。

ある地域内で、複数の道路が互いに一箇所だけ交差するとして、各交差点に交通整理の警察官を配置した場合の必要人数を求めよ

図に示すと次のようなものです。

A_road 道路が1本、交差点なし
2_roads 道路が2本、交差点ひとつ
3_roads 道路が3本、交差点3つ
4_roads 道路が4本、交差点6つ
5_roads 道路が5本、交差点10個

つまり道路の本数を n、お巡りさんの必要人数を Kn と置いたとき、次の漸化式で表現することができます。

K_n=K_{n-1}+n-1 (ただしn > 0, K_0=0)

この手の問題はプログラムを作ることで、道路が数え切れないほどたくさんあっても一瞬に答えを出せることを教えようと、子供に PHPで作ってみな、といってみたものの少々難しかったようです。
アルゴリズムの部分だけ示すと下記のようなコードとなります。

$n = $_GET['numroads'];
printf("<p>Number of roads = </p>", $n);
$Kn = 0;
for ($i = 0; $i < $n; $i++)
{
	$Kn += $i;
}
printf("<p>Number of policemen = %d</p>", $Kn);

numroads にはフォームからユーザに入力してもらった道路の本数が格納されています。

実際に作ってみたフォームがこちらです。お粗末さまでした。