2

Comments

我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……

我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。
Read the rest of this entry »

< ,,,,, >
3

Comments

之前的版本犯了一个重大的错误!我错了……没有经过认真的实验就贴出来……

正文开始前,先看一个式子:

1
x != x

大家觉得,这个东西的返回可能为 true 么?事实上是可能的,只要这个 x 是 NaN,并且这个 C 编译器符合 IEEE 754 的标准。

所谓 NaN,即 Not A Number,不是一个数。这是 IEEE 754 国际浮点数运算标准当中规定的一个特殊值,这个值由于不是一个数,所以有很多奇怪的特性,比如上面这个不等于其本身。

虽然有这么个东西,而且是国际标准,不过我们也知道,这世界上总有那么些公司是不喜欢理会国际标准的,邪恶的 M$ 就是其中之一。而 Visual C++ 6.0 的 C 编译器也就“有幸”成为了少有的不能完全兼容 IEEE 754 的编译器之一。

至此,我们发现一个问题:邪恶的 M$ 的东西中,总是最垃圾的流传的最广,IE6 如此,VC6 也是如此。另外,在此声明一下,这里讲的全部是 C,不是 C++,在 C++ 中另外有一些比较符合标准的方式同时被各个编译器兼容。

OK,回归正题,既然 VC6 的编译器是个渣,可我们有的时候还是不得不让自己的代码与之兼容,于是就有了各种解决办法。
Read the rest of this entry »

< ,,,,,, >
1

Comments

昨天的那篇日志跨编译器的 C 语言 NaN 支持当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序,不过总觉得还是有那么些麻烦,要把待编译的文件复制到 VC6 的安装目录,还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~

于是就有了下面这个小脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# - * - coding: UTF-8 - * -
 
VC6_DIR="这里写上VC6的安装地址"
 
BIN="$VC6_DIR/VC98/Bin"
export INCLUDE="$VC6_DIR/VC98/Include"
export LIB="$VC6_DIR/VC98/Lib" 
 
ARGS=
 
while getopts "o:c" optname
do
  case "$optname" in
  "o")
    ARGS="$ARGS /o$OPTARG"
    ;;
  "c")
    ARGS="$ARGS /c"
    ;;
  esac
done
 
wine "$BIN/CL.EXE" $ARGS ${@:$OPTIND}

然后把他放在 PATH 里面的某个目录下 (我放在了用户级的 /home/upsuper/bin 里,这个似乎要自己添加就是了),然后给这个文件加上可执行属性,最后只要在需要的地方执行:

1
vc6 xxx.cpp

就解决了~
Read the rest of this entry »

< ,,, >

两小段 C 的宏

0

Comments

很久没写 blog 了……大学生活可比高中忙碌多了,哪个混蛋骗我说大学轻松来着……学的东西又难,作业又多,还有学生会活动……啊,我多想回到一中……

最近忙着帮同学写大项目,用 C。话说,对于让没学过编程的人学 C 实在是一件很残酷的事情,即使我现在写仍然觉得很可怕……不过写着写着,觉得 C 实在是一个很神奇的语言,指针和宏是如此的优美~

下面贴两个我在写那项目的时候用到的宏:
Read the rest of this entry »

< , >
1

Comments

今天 Javran 发来短信给了一个短小的论年判断代码,并且问我是否认为有更简单的表达。下面是他最初给的代码:

1
return ((y & 3 != 0) ^ (y % 100 == 0) ^ (y % 400 != 0));

一切的探究就从这个代码开始了。
Read the rest of this entry »

< ,, >
0

Comments

screenshot-opengl今天回家本想在我的 Ubuntu 上玩玩 OpenGL,结果花了一个下午,终于研究出些东西了……

在 NeHe 的源代码中似乎有 Linux 的,不过一个是用 glut、一个是用 SDL、一个是用 GLX,原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统,结果发现全屏不能……于是就找到了 GLFW 这个东西,据说比较简单,不过还是研究了一个下午。

下面说一下研究成果吧,首先,想要用 g++ 编译用 GLFW 写的程序,一定要加这些编译参数: -lglfw -lGL -lGLU -lXrandr,特别是最后一个,是其官方参考中没有的!这个是我查了许多资料,然后瞎猜猜到的……再说说头文件,这次不需要引用3个库了,只有一个 #include <GL/glfw.h> 就可以了,似乎把其他的库自动引用了。另外就是,画完要用 glfwSwapBuffers(); 刷新,不然不仅什么都不会显示,而且还会死机……除此之外,还要注意那个键盘的按键,不要想当然的和 Windows 下拿去类比,根据研究发现,键盘事件交出的 key 最大可以达到 318,而且特殊键都会以这些“大值”返回,所以一定要申请好内存……

这次主要参考了:
GLFW Reference
OpenGL Tutorials – Basics
以及 NeHe 的 OpenGL 教程。
Read the rest of this entry »

< ,, >
0

Comments

test2今天又玩了玩,感觉到 OpenGL 实在太强大了!我也第一次遭到了买好显卡的重要意义:可以写 OpenGL 的程序!右边是效果图,有半透明、点光源效果。其实动起来会比较炫一点。

参考了下面教程(其实主要是抄):
OpenGL教程之纹理映射
OpenGL教程之纹理滤波方式
OpenGL教程之Alpha混合

除了教程里的功能,我还增加了按空格停止和按回车复位两个无聊功能……

整个程序也已经由上一篇的将近400行增加到了超过500行。不过和新的的优美效果比起来,这点代码似乎不算什么~
Read the rest of this entry »

< , >
0

Comments

test1今天突然心血来潮想看看 OpenGL。找了个 OpenGL 的教程,看起来不错。不过这个教程着实吓了我一跳,第一篇的代码就超过了300行!先来一个效果图~

我参考的教程有:
OpenGL教程之新手上路
OpenGL教程之第一个多边形
OpenGL教程之着色
OpenGL教程之旋转
OpenGL教程之向3D进军
Read the rest of this entry »

< , >
1

Comments

经过我许多的资料查找和编写,终于完成了ujudger-base的第一个版本!

ujudger 是我准备编写的基于 Linux 的测评程序,采用 GPL 协议。由于一直以来找不到 Linux 下的测评程序,因此准备自己写一个。ujudger 的 u 既是取我网名的第一个字母,也是 ubuntu 的第一个字母,表示这个程序应该会在 ubuntu 下完成编写。而 ujudger-base 是 ujudger 的基础程序,表现 ujudger 的测评核心,即耗时和内存耗用的取得。使用 time 命令和系统监视器监视器的资料对比一下,ujudger-base 获得的信息还是比较体现程序的真实情况的。
Read the rest of this entry »

< ,,,,, >
4

Comments

今天研究Discuz!代码的时候要搜索一个函数在哪里被调用,结果不懂怎么办。

Windows的搜索貌似某个服务被我禁了一直以来都不能用,而Google的Desktop又不收编这些东西……

花了一点时间写了一个QuickSearch,代码也很短,效率也很高。用法就是“QuickSearch 关键字”。就会遍历当前目录及其子目录下的所有的文件,查找包含关键字的文件。

如果你也喜欢可以在这里下载:QuickSearch.exe (16KB)

由于使用VS2005编译,需要.NET Framework 2.0支持。源代码在下方,可以用VS2003编译。

Read the rest of this entry »

< , >