分类目录归档:程序设计

自制编译型表达式计算器

起因是这个问题

http://zhidao.baidu.com/question/1110099820559411499.html

因为当时我编译原理课根本没有好好听,所以就决定尝试一下自己写这样的东西能写成什么样。

虽然写出来了,不过貌似没有满足,然后就进行魔改。

下面的代码是魔改的结果,能蛋疼成这样,我实在无话可说了……(死鱼眼

输入一个表达式,然后这个程序能计算它的值。支持加减乘除和括号,只支持整数,表达式中不能含有空格

注意:不能在“数据执行保护(DEP)”环境下执行。VC链接的时候不能带/NXCOMPAT选项,系统设置里也不能用“为所有程序启用数据执行保护”。

继续阅读自制编译型表达式计算器

尾递归和编译器优化

从最早学C语言的时候接触递归的时候就写过递归函数了。什么从1加到100,算阶乘等等。不过因为递归的函数调用操作要浪费不少时间,加上写起来也没习惯,就不怎么爱用。

最近稍微接触了一点Haskell这种函数式编程语言,然后就又想起C语言的递归了。之后在C语言里也尝试了Haskell里那样的写法。有说“尾递归可以转变为循环”,似乎编译器优化也是这么做的。但是自己在尝试的时候却没发现它变成了循环。

继续阅读尾递归和编译器优化

引用计数和对象的有效性

之前搞东方弹幕游戏OGG版本的时候,用了这么一套机制:实现自定义的CreateFileA、ReadFile、SetFilePointer、CloseHandle这些函数,然后替换掉程序对这些API的调用。如果CreateFileA打开的文件是thbgm.dat,那么就创建一个读取OGG文件的对象,然后把对象指针加入到一个列表中,并返回给程序;如果调用ReadFile的时候送入的HANDLE是在列表中的某个对象,就执行对象上的Read操作;SetFilePointer同理;如果调用CloseHandle的时候送入的是列表里的某个对象,就把对象从列表中删除,然后delete掉它。

继续阅读引用计数和对象的有效性

.net 2.0下往流输出文本多了抛异常

前天在群里聊天的时候,喵喵提到.net 2.0平台下,有个控制台程序运行时间久了,呃,要说有多久可能一个月那种程度吧,崩了。而且是崩在Console.Write里面。说上网找了以后说是.net平台自己有问题。

第二天有空的时候,我自己试验了一下,确实很坑,我开了个文本文件(FileStream),然后以它创建一个StreamWriter,之后往里面写了三四个G的数据,写一半的时候就直接抛出了异常,异常信息和喵喵描述的一致。

继续阅读.net 2.0下往流输出文本多了抛异常

curl_easy_perform卡着了

之前想做个挂stage1st论坛在线时间的工具,用C#写出来以后虽然用着也确实可以登录和浏览,但是用mono在vps的linux系统上跑,内存占了实在是有点多,想到vps本来内存就这么小,还跑了一大堆奇怪的服务,最后作罢。

但是果然想想还是不甘心,于是就又操起C++来弄,调用了CURL函数库来搞,这样windows和Linux下就都可以使用了。弄好以后也确实可以运行,于是就这么挂着。

为了详细知道这工具现在在干什么,所以我让它输出当前动作的信息。挂了几天之后,发现好像没有新的信息输出了。用gdb附加上去看调用栈,卡在curl_select里面了(和自己的代码的接口是curl_easy_perform)。这个时候的工具在输出信息的时候还不会附上当前的时间,所以也不太确定到底什么时候出的问题。于是我就改了一下代码,在输出的地方加上了时间,然后挂着。今天下午又发现它卡着了,看了时间,卡了2个多小时了。用gdb再附加上去,还是那个地方卡着。

继续阅读curl_easy_perform卡着了

使用WDK开发普通XP应用程序注意点

这几天尝试拿WDK的库和编译器编译普通程序。目的是为了能链接到MSVCRT.DLL上去,减小自身程序体积。

很长时间了也没有人报有什么问题,自己是Win7的系统,其实也没有测试过XP下能不能使用。

但是很坑爹的是,事实证明不行……今天贴吧上有人报了XP下无法启动,报msvcrt.dll中找不到_except_handler4_common入口。

我检查了一下我编译出来的程序的导入表,果不其然有_except_handler4_common……

网上搜了一下,出来的基本都是说你把dwmapi.dll改名吧。但是我现在是导入表中直接有这一项,明显不是这个的问题。

继续阅读使用WDK开发普通XP应用程序注意点