UTunnels's profile地道联盟臭蛋军BlogLists Tools Help
No list items have been added yet.

地道联盟臭蛋军

=SMA=
8/24/2006

98年的老程序啊

去msdn查找script相关的信息,找到一个很老的脚本范例,编译成dll文件可以在ie里面调用。
我把其中的Interpreter单独拿出来做了个通用的脚本解析程序。
语法是仿照c的,不过有不少缺陷和bug,orz,本来以为拿来就能用了,sample毕竟是sample……
 
首先是编译的问题,iostream.h在vc7里面已经没有了,改为iostream,并且用std命名空间。
再就是脚本解析上的bug:
    ·用了static的变量来储存递归调用中的计数,递归结束了居然忘记把变量复位……
    ·解析Instruction的时候,循环里面list++了,但是里面某个函数调用又给++了一次,
还有些缺陷:
    ·不支持数组(无语,现在写程序里如果没有数组……)
    ·不能解析%取模运算(好说,加上个操作就是了)
    ·不能解析 += /= *= %=操作(罢了,不用也不是不行)
    ·没有指针类型(算了,脚本也不必这么高级)
    ·貌似忘记回收内存?
 
修改了一通,加上CFunctionLibrary类来添加一些系统函数,貌似可以用这个来构建一个替代数组的方法。
例如Array(怎么写到后来跟js学了……)
7/19/2006

传统观念颠覆了

JavaScript里面定义一个数组居然写
var a = [];( =new Array()也一样的)
本来早已经习惯了{}来初始化一个数组,结果js里面这么写
var a = {};
实际上是定义了一个Map(或者说Hashtable之类的)
Map里面取值/赋值也是用索引例如
a["keyname"]="12121";
a["keyname"]=[1,2,3,232,5,];
这点又像c#
Array居然有push和pop方法,唉,真是四不像的东西。
5/28/2006

汉化老是出现灵异现象,原来……

老是有莫名其妙的个别字符错误,查对导入的数据又是对的。
 
今天忽然发现“让一让”中的前一个“让”居然变成“怎”了,对照原文发现那个位置可以被2048整除……
 
于是检查其他出问题的地方,无一例外都是2048的倍数~~~
 
看来是写ppf的时候每隔2048就少写1个字节。。。
4/5/2006

复活

搬家之后一直没上网,现在总算爬上来了 -_,-
2/14/2006

- -,无效劳动了。

忘记了还有函数模板这个东东了,先前居然研究了n久bug……
 
恍然大悟ing
2/12/2006

太神奇了-,-,猜猜结果

class A
{
private:
	LPSTR sa;
public:
	A(){sa="aaa";}
	void afunc()
	{
		MessageBox(NULL,sa,"this is A::afunc",MB_OK);
	}
};
/*B继承A*/
class B:public A
{
private:
	LPSTR sb;
public:
	B():A(){sb="bbb";}
	void bfunc()
	{
		MessageBox(NULL,sb,"this is B::bfunc",MB_OK);
	}
};
/*C继承A*/
class C:public A
{
private:
	LPSTR sc;
public:
	C():A(){sc="ccc";}
	void cfunc()
	{
		MessageBox(NULL,sc,"this is C::cfunc",MB_OK);
	}
};



typedef void (A::*LPDELEGATEAFUNC)(void);

/*WinMain*/
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR CmdLine,int CmdShow)
{
	/*实例化B和C*/
	B* b=new B();
	C* c=new C();
	/*A成员函数指针指向B的成员函数*/
	LPDELEGATEAFUNC pf=(LPDELEGATEAFUNC)B::bfunc;
	/*用C的实例调用该函数*/
	(c->*pf)();

}/*WinMain*/
2/10/2006

用VC++的try/catch玩一个花招-.-

这几天自己写个Container类,用在d3d绘图环境下实现窗口/按钮类似的功能,开始的架构很单纯,用一个static的链表来存放所有的底层Container句柄,用一个链表存放下一级Container(Children)句柄,用一个Container*存放上一级Container(Parent)句柄,除了写好相应的Add, Remove方法以外,再用virtual方法写鼠标和键盘响应函数(OnMouseDown, OnMouseMove, OnKeyDown, OnKeyUp...),假如需要写按钮,就继承Container类,写好按钮的功能,重写那些键盘和鼠标响应函数。
 
经过一段时间,程序初具规模,但是发现了一系列问题,绘图的问题暂且按下不表,单是那些virtual方法来实现键盘鼠标功能就很成问题:覆盖问题。要实现新功能同时保留基类的功能确实比较麻烦。于是我想到java和.net的实现方式:用一个列表存放这些响应方法,触发事件的时候执行列表里面的所有方法。于是:重写……
 
当然一开始想到函数指针了,用链表存放这些函数指针,然后逐一调用。开始写了,添加n多链表来存放不同事件的响应函数指针,但是写到一半了,忽然想到这些方法可能会是成员函数,但是成员函数指针和普通函数指针是不能转换的,甚至不能把void*转换成成员函数指针,也就是说原来写的那个链表类(用void*保存指针)根本不能存放成员函数指针……
 
C#的delegate是个好东西,无论是成员函数还是static函数都一视同仁,但是对于C++来说就要命了,两者不能转换(编译器这关都混不过去)。。。。
 
最后想到了union-_,-,把成员函数指针和函数指针都放进去,然后用try/catch来耍个花招:
     try
    {
        转换成函数指针调用
    }
    catch(...)
    {
        try
        {
            转换成成员函数指针调用
        }
        catch(...){}
    }
编译通过,正高兴呢,运行,出错……
 
错误居然在一个不相干的位置,看来是try/catch引起不良反应了。。。想了半天没有结果,后来随手把两个try模块交换了一下位置,结果没错误了……诡异…………虽然不明白原理,暂且喘口气。