{$array|@count}
- $array:配列
- @:$arrayが配列ですよと指定している
- count:PHPのcount関数
そんでもってcount()はPHPの関数で、それはつまりSmartyからPHPの関数を呼び出すことが出来るってことです。しらなかったぁ~
このブログは主に C C++ PHP WSH XCODE オブジェクト指向 に関する記事が多いはず!
Event.observe(window, 'load', funcA(), false); Event.observe(window, 'load', funcB(), false);
$arr = array(1, 2, 3, 4);
print_r($arr);
unset($arr[1]);
print_r($arr);
$dict = array ("a" => "aa", "b" => "bb", "c" => "cc");
print_r($dict);
unset($dict['b']);
print_r($dict);
こんな感じです。
function focusAnchor() {
var anchors = document.anchors;
anchors['target'].focus();
// idでアンカーを取得する場合
// var anchor = document.getElementById('target');
// anchor.focus();
}
特に難しい処理はありません。目的のアンカーを取得してfocus()を呼び出しているだけです。targetHTML側では一点注意しなければいけないことがあります。それは
#include#include "Monster.h" void main(void) { int hp = 111; int mp = 222; // Monster生成 Monster monster(hp, mp); // 参照している変数の値を変更 hp = 100; mp = 100; // 表示 printf("HP:%d\n", monster.HP); printf("MP:%d\n", monster.MP); printf("hit any key...\n"); while(getchar() == EOF){} }
#ifndef _MONSTER_H_ #define _MONSTER_H_ #includeソースコードの内容については余りつっこまないでください(汗class Monster { //---------------------------------- // field //---------------------------------- public: int& HP; // メンバ変数が参照型 int& MP; // メンバ変数が参照型 //---------------------------------- // method //---------------------------------- public: // constructor Monster(int& _hp, int& _mp) : // コロンをわすれずに! HP(_hp), // 初期化子 MP(_mp) // 初期化子 { // do nothing... } }; #endif
#include#include #include "ConcreteClass.h" void main(void) { // ConcreteClassオブジェクト生成 AbstractClass* obj = new ConcreteClass(); // 型名取得 const type_info& id = typeid(*obj); printf("%s\n", id.name()); // method()の呼び出し obj->method(); // 型を直接指定し型名を取得し比較 if (typeid(ConcreteClass) == id) { printf("true\n"); } delete obj; printf("hit any key...\n"); while(getchar() == EOF) {} }
#ifndef _ABSTRACT_CLASS_H_ #define _ABSTRACT_CLASS_H_ #include#include class AbstractClass { //---------------------------------- // method //---------------------------------- public: void method() { // 型情報の取得 const type_info& id = typeid(*this); // 表示 printf("AbstractClass-typeid:%s\n", id.name()); // subMethod()の呼び出し this->subMethod(); } protected: virtual void subMethod() = 0; }; #endif
#ifndef _CONCRETE_CLASS_H_ #define _CONCRETE_CLASS_H_ #include#include #include "AbstractClass.h" class ConcreteClass : public AbstractClass { //---------------------------------- // method //---------------------------------- public: ConcreteClass() { // do nothing... } virtual ~ConcreteClass() { // do nothing... } protected: virtual void subMethod() { // 型情報の取得 const type_info& id = typeid(*this); // 表示 printf("ConcreteClass-type_id:%s\n", id.name()); } }; #endif
WScript.echo(this.getScriptFolder());
// スクリプトフォルダの取得
function getScriptFolder() {
return WScript.ScriptFullName.replace("\\" + WScript.ScriptName, "");
}
try {
var main = new main(WScript.Arguments);
main.exec();
}
catch(e) {
WScript.echo(e);
WScript.Quit();
}
function main (_args) {
// Windows Media Playerコントロールオブジェクト生成
this.objWMP = WScript.createObject("WMPlayer.OCX");
// FileSystemObject生成
this.objFileSys = WScript.CreateObject("Scripting.FileSystemObject");
// ShellObject生成
this.objShell = WScript.createObject("WScript.Shell");
// 引数の取得
this.objArgs = _args;
if (this.objArgs.UnNamed.count <= 0) {
throw "ファイル叉はフォルダをドラッグ&ドロップするか\nコマンドラインから引数としてファイル又はフォルダパスを指定してください。";
}
//---------------------------------
// exec()
//---------------------------------
this.exec = function() {
// logファイルの生成(上書きモード)
var logFileName = "PlayTimeLog.txt";
var objLogFile = this.objFileSys.OpenTextFile(logFileName, 2, true);
var fileCnt = 0;
// 全ての名前なし引数について処理する
var unNamedArgs = this.objArgs.UnNamed;
var enu = new Enumerator(unNamedArgs);
for (; enu.atEnd() == false; enu.moveNext()) {
try {
var arg = enu.item();
fileCnt = this.logPlayTime(objLogFile, arg);
}
catch(e) {
objLogFile.WriteLine(e);
}
}
// サマリー情報の書き込み
objLogFile.WriteLine("----------------------------------------");
objLogFile.WriteLine(fileCnt + "件のファイルを処理しました。");
// logファイルのクローズ
objLogFile.Close();
// 完了メッセーの表示
WScript.echo(
"mission completed\n"
+ "作業結果は\n"
+ this.objShell.CurrentDirectory
+ "\\" + logFileName + "\n"
+ "参照"
);
}
//---------------------------------
// サブフォルダも含めて動画ファイルの再生時間をlogファイルに書き込む
//---------------------------------
this.logPlayTime = function (_objLogFile, _path) {
var fileCnt = 0;
// パスがフォルダの場合
if (this.objFileSys.FolderExists(_path)) {
// フォルダオブジェクトの生成
var objFolder = this.objFileSys.GetFolder(_path);
// サブフォルダ一覧取得
var subFolders = objFolder.SubFolders;
// 全てのフォルダについて自分を呼び出す
var enuSubFolders = new Enumerator(subFolders);
for (;enuSubFolders.atEnd() == false; enuSubFolders.moveNext()) {
fileCnt += this.logPlayTime(_objLogFile, enuSubFolders.item().Path);
}
// ファイル一覧取得
var files = objFolder.Files
// 全てのファイルについて自分を呼び出す
var enuFiles = new Enumerator(files);
for (; enuFiles.atEnd() == false; enuFiles.moveNext()) {
fileCnt += this.logPlayTime(_objLogFile, enuFiles.item().Path);
}
}
// パスがファイルの場合
else if (this.objFileSys.FileExists(_path)) {
// ファイルオブジェクトの生成
var objFile = this.objFileSys.GetFile(_path);
// 再生時間の取得
var time = this.getPlayTime(objFile.Path);
// logファイルに書き込み
_objLogFile.WriteLine(objFile.Name + "\t" + time);
// ファイル数をインクリメント
fileCnt++;
}
else {
objLogFile.WriteLine("error:" + _path + "は存在しません");
}
return fileCnt;
}
//---------------------------------
// 動画再生時間の取得
//---------------------------------
this.getPlayTime = function(_filePath) {
// 動画ファイルの読み込み
this.objWMP.URL = _filePath;
// ファイル準備中状態の間待つ
while (this.objWMP.playState == 9) {
WScript.Sleep(500);
}
// 再生時間取得
return this.objWMP.currentMedia.durationString;
}
}
ソースコード長いw
var datas = {
a:"aa",
b:"bb",
c:"cc"
};
// 辞書(Dictionary)の生成
var objDict = WScript.createObject("Scripting.Dictionary");
for (var key in datas) {
// 要素の追加
objDict.add(key, datas[key]);
}
//--------------------------------------
// プロパティ
//--------------------------------------
// 要素数の取得
var cnt = objDict.Count;
WScript.echo("要素数の取得:" + cnt);
// 要素の取得
WScript.echo("要素の取得1:" + objDict.Item("a"));
WScript.echo("要素の取得2:" + objDict("a"));
// キーを変更する
objDict.Key("a") = "A";
WScript.echo("\"A\"の値:" + objDict.Item("A"));
//--------------------------------------
// メソッド
//--------------------------------------
// キーの存在判定
if (objDict.Exists("A")) {
WScript.echo("\"A\"は存在します");
}
// Enumeratorを使用した反復
var enuDict = new Enumerator(objDict);
var strItems = "";
for (; enuDict.atEnd() == false; enuDict.moveNext()) {
strItems += objDict(enuDict.item()) + ",";
}
WScript.echo(strItems);
// キーを指定して削除
objDict.Remove("b");
objDict.RemoveAll();
WScript.echo("要素数:" + objDict.Count);
紹介しておいてなんですが、機能が微妙な上にJScript(JavaScript)は連装配列が使えるのでDictionaryは使わないかもしれません。
var array = new Array();
array["a"] = "aa";
array["b"] = "bb";
for (var key in array) {
// WScript.echo(array[key]); // WSHの場合
alert(array[key]);
}
try {
// Windows Media Playerコントロールオブジェクト生成
var objWMP = WScript.createObject("WMPlayer.OCX");
// 動画ファイルの読み込み
objWMP.URL = ".\\aaa.wmv";
// ファイル準備中状態の間待つ
while (objWMP.playState == 9) {
WScript.Sleep(500);
}
// 再生時間取得と表示
WScript.echo(objWMP.currentMedia.durationString);
}
catch(e) {
WScript.echo(e);
WScript.Quit();
}
「aaa.wmv」というファイルの再生時間を表示しています。
try {
// FileSystemObject生成
var objFileSys = WScript.CreateObject("Scripting.FileSystemObject");
// ファイル一覧(コレクション)取得
var folder = objFileSys.GetFolder("C:");
var files = folder.Files;
// Enumeratorを使用してファイル一覧を反復する
var str = "";
var iter = new Enumerator(files);
for (;iter.atEnd() == false; iter.moveNext()) {
str += iter.item().Name + "\n";
}
// ファイル一覧表示
WScript.echo(str);
}
catch (e) {
WScript.echo(e);
WScript.quit();
}
#includetypedefを使用してデータ型に新しい名前を付けることが出来るのですが、Weaponは宣言を直接typedefしています。struct Character { char name[32]; int HP; int MP; }; typedef struct { char name[32]; int attack; }Weapon; void main (void) { struct Character character; // struct が必要 Weapon knife; // struct が不要 printf("hit any key..."); while(getchar() == EOF){} }
const int value = 1;
if(value = 1) // ← ==のつもり
こんなのとかconst CHoge hoge;
hoge.clear(); // ←本当はclearしてはダメ
とかコンパイルエラーになります。#includevoid main(void) { //---------------------------------- // サイズを求めて反復に使用する //---------------------------------- const char* strArray[] = { "1", "2", "3", }; const int length = sizeof(strArray) / sizeof(strArray[0]); // 配列のサイズ算出 printf("length:%d\n", length); for (int i = 0; i < length; i++) { // length未満の間ループ printf("%s\n", strArray[i]); } printf("--------\n"); //---------------------------------- // 番兵を立てる //---------------------------------- const char* strArray2[] = { "a", "b", NULL, // 番兵 }; for (int i = 0; strArray2[i]; i++) { // false(NULL)以外の間ループ printf("%s\n", strArray2[i]); } printf("hit any key...\n"); while(getchar() == EOF){} }
#ifndef _CHARACTER_H_ #define _CHARACTER_H_ #includeclass Character { public: // constructor Character() { this->init(); } // destructor ~Character() { // do nothing... } protected: virtual void init() { // 仮想関数で定義 printf("init Character\n"); } }; #endif
#ifndef _CHARACTER_MONSTER_H_
#define _CHARACTER_MONSTER_H_
#include "Character.h"
class CharacterMonster : public Character
{
public:
// constructor
CharacterMonster() {
// do nothing...
}
// destructor
virtual ~CharacterMonster() {
// do nothing...
}
protected:
virtual void init() { // オーバーライド
printf("init Character Monster\n");
}
};
#endif
#include "CharacterMonster.h" #includeinit()はオーバーライドされているのでこのプログラムを実行すると「init Character Monster」が表示されると思いきや「init Character」が表示されてしまいます。void main(void) { Character* character = new CharacterMonster(); delete character; printf("hit any key..."); while(getchar() == EOF){} }
#ifndef _MONSTER_H_
#define _MONSTER_H_
#include "MonsterStrategy.h"
class Monster
{
//----------------------------------
// constant
//----------------------------------
#define STRATEGY_MAX_NUM 8
//----------------------------------
// field
//----------------------------------
private:
MonsterStrategy* m_strategyDictionary[STRATEGY_MAX_NUM]; // ①
MonsterStrategy::Type m_currentStrategyType; // ②
//----------------------------------
// property
//----------------------------------
public:
const MonsterStrategy::Type getCurrentStrategyType();
Monster& setCurrentStrategyType(const MonsterStrategy::Type _type);
private:
MonsterStrategy** getStrategyDictionary();
const bool addStrategy(const MonsterStrategy::Type _type);
//----------------------------------
// mothod
//----------------------------------
public:
// constructor
Monster();
// destructor
~Monster();
// initialize
const bool init();
// move
Monster& move(); // ③
private:
// operator(=)
Monster& operator=(const Monster& _monster);
};
#endif
①Monsterの行動アルゴリズム辞書です。今回は配列を使用していますがDictionary系クラスを私用するのが良いでしょう。#include "Monster.h" #include "MonsterStrategyFreedom.h" #include "MonsterStrategyGangan.h" #include①配列のサイズを求めています。//----------------------------------- // property //----------------------------------- const MonsterStrategy::Type Monster::getCurrentStrategyType() { return this->m_currentStrategyType; } Monster& Monster::setCurrentStrategyType(const MonsterStrategy::Type _type) { printf("strategy %d -> %d\n", this->getCurrentStrategyType(), _type); this->m_currentStrategyType = _type; return *this; } MonsterStrategy** Monster::getStrategyDictionary() { return this->m_strategyDictionary; } const bool Monster::addStrategy(const MonsterStrategy::Type _type) { if (STRATEGY_MAX_NUM <= _type) { throw "error strategy max num"; } MonsterStrategy** strategyDictionary = this->getStrategyDictionary(); if (strategyDictionary[_type] != NULL) { // already exist return false; } switch (_type) { case MonsterStrategy::ST_FREEDOM: strategyDictionary[_type] = new MonsterStrategyFreedom(); break; case MonsterStrategy::ST_GANGAN: strategyDictionary[_type] = new MonsterStrategyGangan(); break; default: throw "invalid type"; break; } return true; } //----------------------------------- // method //----------------------------------- // constructor Monster::Monster() : m_currentStrategyType(MonsterStrategy::ST_FREEDOM) { // do nothing... } // destructor Monster::~Monster() { MonsterStrategy** strategyDictionary = this->getStrategyDictionary(); for (int i = 0; i < STRATEGY_MAX_NUM; i++) { delete strategyDictionary[i]; } } // initialize const bool Monster::init() { MonsterStrategy** strategyDictionary = this->getStrategyDictionary(); for (int i = 0; i < STRATEGY_MAX_NUM; i++) { strategyDictionary[i] = NULL; } const MonsterStrategy::Type strategyTypeArray[] = { MonsterStrategy::ST_FREEDOM, MonsterStrategy::ST_GANGAN, }; const int size = sizeof(strategyTypeArray) / sizeof(MonsterStrategy::Type); // ① for (int i = 0; i < size; i++) { this->addStrategy(strategyTypeArray[i]); } return true; } // move Monster& Monster::move() { MonsterStrategy** strategyDictionary = this->getStrategyDictionary(); strategyDictionary[this->getCurrentStrategyType()]->move(*this); return *this; }
#ifndef _MONSTER_STRATEGY_H_
#define _MONSTER_STRATEGY_H_
class Monster;
class MonsterStrategy
{
public:
//----------------------------------
// constant
//----------------------------------
enum Type {
ST_FREEDOM = 0, // 自由
ST_GANGAN, // がんがん行こうぜ
}; // ①
//----------------------------------
// mothod
//----------------------------------
public:
// constructor
MonsterStrategy();
// destructor
virtual ~MonsterStrategy();
// move
virtual void move(Monster& _monster) = 0; // ②
private:
// operator(=)
MonsterStrategy& operator=(const MonsterStrategy& _monsterStrategy);
};
#endif
①Monsterの行動アルゴリズムのタイプです。#include "MonsterStrategy.h" #include特に何も実装はなしです。//---------------------------------- // mothod //---------------------------------- // constructor MonsterStrategy::MonsterStrategy() { // do nothing... } // destructor MonsterStrategy::~MonsterStrategy() { // do nothing... }
#ifndef _MONSTER_STRATEGY_FREEDOM_H_
#define _MONSTER_STRATEGY_FREEDOM_H_
#include "MonsterStrategy.h"
class Monster;
class MonsterStrategyFreedom : public MonsterStrategy // ①
{
public:
//----------------------------------
// mothod
//----------------------------------
public:
// constructor
MonsterStrategyFreedom();
// destructor
~MonsterStrategyFreedom();
// move
void move(Monster& _monster); // ②
private:
// operator(=)
MonsterStrategyFreedom& operator=(const MonsterStrategyFreedom& _monsterStrategyFreedom);
};
#endif
#include "MonsterStrategyFreedom.h" #include "MonsterStrategy.h" #include "Monster.h" #include//---------------------------------- // mothod //---------------------------------- // constructor MonsterStrategyFreedom::MonsterStrategyFreedom() { // do nothing... } // destructor MonsterStrategyFreedom::~MonsterStrategyFreedom() { // do nothing... } // move void MonsterStrategyFreedom::move(Monster& _monster) { printf("freedom\n"); }
#ifndef _MONSTER_STRATEGY_GANGAN_H_
#define _MONSTER_STRATEGY_GANGAN_H_
#include "MonsterStrategy.h"
class Monster;
class MonsterStrategyGangan : public MonsterStrategy // ①
{
public:
//----------------------------------
// mothod
//----------------------------------
public:
// constructor
MonsterStrategyGangan();
// destructor
~MonsterStrategyGangan();
// move
void move(Monster& _monster); // ②
private:
// operator(=)
MonsterStrategyGangan& operator=(const MonsterStrategyGangan& _monsterStrategyGangan);
};
#endif
#include "MonsterStrategyGangan.h" #include "MonsterStrategy.h" #include "Monster.h" #include①MonsterStrategyを継承しています。//---------------------------------- // mothod //---------------------------------- // constructor MonsterStrategyGangan::MonsterStrategyGangan() { // do nothing... } // destructor MonsterStrategyGangan::~MonsterStrategyGangan() { // do nothing... } // move void MonsterStrategyGangan::move(Monster& _monster) { printf("inochi\n"); }
#include "Monster.h" #includevoid main(void) { Monster monster; // モンスター生成 monster.init(); // 初期化 monster.move(); // move monster.setCurrentStrategyType(MonsterStrategy::ST_GANGAN); // 戦略変更 monster.move(); // move printf("hit any key..."); while(getchar() == EOF){} }