2010年7月21日水曜日

C++プログラマがLuaを勉強してみる第14回

テーブルは常に参照型です(キリッ
数値は参照型ではありません。
文字列は参照型かもしれませんが文字列を直接編集する事はできないので特に意識する事は無いと思います。

2010年7月20日火曜日

C++プログラマがLuaを勉強してみる第13回

◆C/C++からLuaを呼び出すためのライブラリをコンパイルしてみる
さて、今回はLua5.1.4とVisual Studio 2008を使ってライブラリをコンパイルしてみます。

STEP 1:ソースをダウンロード
まずはここからソースをダウンロードして解凍します。

STEP 2:Visual Studio 2008でプロジェクト作成
VC++でWin32プロジェクトを作成します。

 次にアプリケーションの設定をスタティックライブラリに設定します。

 完了します。

 STEP 3:srcの取り込み
ダウンロードしたlua-5.1.4.tar.gzを解凍してsrcフォルダSTEP 2で作成したプロジェクトの有るフォルダにコピーします。
srcフォルダ内の.cファイルと.hファイルをプロジェクトに取り込みます。
このとき下記のファイルは必要有りません。
  • lua.c
  • luac.c
  • print.c




STEP 4:プロジェクトの設定
プリプロセッサの定義に_CRT_SECURE_NO_DEPRECATEを追加します。

えーっとプロジェクトの設定とかあまり詳しくないので過不足あったらすいません。

STEP 4:ビルド

2010年7月19日月曜日

C++プログラマがLuaを勉強してみる第12回

◆C/C++からLuaを実行する
C++からLuaのコードを実行するサンプルをつくりました。
C++からLuaのコードを実行するためのライブラリ(lib)のコンパイルは後日紹介します。

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

int main(int argc, char* argv[])
{

 // LuaのVMを生成
 lua_State *const L = lua_open();

 // Luaの標準ライブラリを開く
 luaL_openlibs(L);

 while (true) {
  // luaファイルを指定して実行する
  if (luaL_dofile(L, "test.lua")) {
   // エラー内容の取得
   printf("error:%s\n", lua_tostring(L, -1));
   lua_pop(L, 1);
   return 0;
  }

  // 直接コードを指定する
  if (luaL_dostring(L, "print('hello lua world')")) {
   // エラー内容の取得
   printf("error:%s\n", lua_tostring(L, -1));
   lua_pop(L, 1);
   return 0;
  }

  printf("\n");
  printf("hit any key...\n");
  printf("0 is exit\n");
  const char c = getchar();
  if (c == '0') {
   break;
  }
 }

 // LuaのVMを閉じる
 lua_close(L);

 return 0;
}
getchar()のところでtest.luaを編集ご実行すると編集内容が反映されます。

2010年7月18日日曜日

LIBCMT.libとMSVCRTD.libの競合

Luaのライブラリを利用しようとしたら出たエラーです。
ライブラリ(lib)がVC2005でコンパイルされていたので
VC2008のReleaseモードでコンパイルしたらでなくなりました。

LIBCMT.lib(_file.obj) : error LNK2005: ___iob_func は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup は既に MSVCRTD.lib(crtexe.obj) で定義されています。
LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(lconv.obj) : error LNK2005: _localeconv は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(atox.obj) : error LNK2005: _atoi は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(strtol.obj) : error LNK2005: _strtoul は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。

2010年7月17日土曜日

相手の意見を頭ごなしに否定しない

誰しも有ると思いますが、相手よりも優位に立ちたい、自分の評価を上げたい等の心理からついつい相手の意見を否定したり、あらを探したりしてしまいがちですがそれだと仕事、人間関係ともにうまくいかない場合が多いのではないでしょうか?
そこで、相手の意見は出来るだけ否定せずに意見をよく理解してメリットデメリットを述べ、その上で自分の持っている意見を提示するのが良いのではないでしょうか。

2010年7月16日金曜日

PHPのforeachで$valueを参照型にする

PHP5以降foreachの$valueを参照型にすることができるんですね、今日知りました。
参照型にすると次のようなメリットがありますね
  • コピー処理が実行されないのでループ処理が速くなる
  • 配列内の各要素に処理をするのが楽
逆にデメリットは
  • 参照であるがゆえにプログラマが意図しない処理となってしまう場合がある
ってとこですかね
簡単なコード例を用意しました。
$num_array = array(1,2,3,4,5);
    foreach ($num_array as &$value) {
        $num += 1;
    }
    unset($value);
    print_r($num_array);

2010年7月14日水曜日

WEBベージ上のテキストデータをクリップボードへコピーする(IE)

IE限定ですがJScriptをつかってWEBページ上のテキスト情報をクリップボードにコピーすることができます。

愛をください。


ソースコードはこんな感じです。
JScript

HTML
愛をください。