灾难巨制'海神号'

今天是到大连来的第一个周末,和几个朋友一起去大连的几处闹市区’探路’,毕竟初来乍到,需要朋友们指引。中午饭后,朋友们觉得也没什么可去的地方,其中一个提议去看电影,我也好久没到影院去看电影了,上次本想去看Da Vinci Code的,可是后来片子由于宗教问题而被撤下,我也就扑了个空。反正也没什么事,去看看电影,消遣一下。其实我们也不知道现在上映什么电影呢,去了再说。

朋友有一张奥纳电影城的会员卡,可以打8折的,我们就定下去奥纳了。后来听说奥纳电影城是东北首家五星级影城,其实感觉和沈城的几家影院也没差太多,票价也不贵,一般20-25元,在外面的代理点买票更便宜,15块就可以拿下。今天上映的电影不少,什么’天空决战’、’撒哈拉骑兵’、’冰河世纪2′、’海神号’等,遗憾的是’超人归来’是在两天后才公映,没赶上。反正这几部电影我们都没看过。我是偏向’海神号’的,一来是因为我觉得在电影院看这种灾难片,视听效果肯定没得比;二是屏幕上显示’海神号’的播放厅是’巨幕’的,我还从未看过巨幕电影呢,这次一定要尝试一把。还好,其他人和我的想法不谋而合。离电影开演还有半个小时,我们在这个间歇期间还看了场泳装模特儿表演,过瘾^_^!

检票进入放映厅,的确是巨幕,整个屏幕我想有10米高吧,估计是一般屏幕的三个那么高,我们接受了售票员的建议,坐在了偏后的位置。不过当电影开演时却很是让我们失望,屏幕虽然是巨幕,但是影片却还是正常电影放映,那么大的一个屏幕,只是在中间区域有内容,气愤。这不是’欺诈’么?没办法,继续看电影吧。

言归正传说电影。其实’海神号’已经上映很久了,当初并没想看,就因为怕该片在特技和情节上与’泰坦尼克号’有雷同,怕看了不值。不过,看完之后觉得各有千秋,当然N年前的’泰坦尼克号’在特技方面是无论如何都赶不上这部’海神号’了,毕竟科技发展如此迅速。有人说:海神号情节有些单一,我倒是不以为然,侧重点不同罢了。’泰坦尼克号’为了表现两个年轻人的’爱情’,又怎能不花上一段时间去演绎呢,海神号反倒来的猛烈来的直接。一个大浪,除了逃生还是逃生,让你在看片子的时候,没有喘息的时间,让你始终神经绷紧,和影片中的主人公一起感受那种灾难来临、死亡即将降临时的内心变化。海神号中也有爱情,同样更有亲情和人性,母亲为了儿子,父亲为了女儿甘愿牺牲自己,当然还有在危急时刻的无奈,也就是那个厨师海员的死,真是无奈之举亚。影片的视听冲击力很是震撼,看完电影后,手心里一层冷汗,特别是在那种硬件设施很好的影院中,奥纳的音响设备我觉得还是不错的,一些从声道的音质也很清晰,这是在电脑上看所感受不到的。看到很多幕后介绍说很多危险镜头都是演员们亲自上阵的,没有使用替身,这也增加了这部戏的精彩程度,演员们也因此时常挂彩,拍摄这种题材的片子还真是一种挑战,不易呀,特别是那个小演员吉米·本奈特,这么小就经历了一次’海难’的洗礼,对其以后的发展还是很有好处的。两位男主人公乔什·卢卡斯和科特·拉塞尔也都是演技一流的’职业选手’了,喜欢灾难片的朋友不妨也到影院去看看。

唯一遗憾的就是巨幕不放巨幕电影,听说有一种新的IMAX(Image MAX)格式的电影将来会越来越普及,IMAX格式我想就是真正的巨幕电影吧,到那时看这种灾难性质的影片一定不会让你失望的。

P.J.Plauger版本C标准库实现分析之'assert.h'

I believe that seeing a realistic implementation of the Standard C library can help you better understand how to use it.
                                                                                  — P.J.Plauger

按照字母序首先我们来看看<assert.h>,这个文件提供的接口功能很简单,但却是我们极其常用的功能-断言机制(如果条件为False,则输出Diagnostics信息,然后Abort)。当然在最终产品中使用断言并不是一种好的方法,不过断言是一种很有用的帮助我们调试程序的好工具。

我们一般在程序的调试版本中使用断言机制,一般用来对Input进行Validation,输出一些Diagnostics信息。如:
assert((idx > 10) && (idx < 100));

<assert.h>中提供一个宏assert,这个宏的功能由另一个宏NDEBUG(标志是否是DEBUG版本)决定。如果NDEBUG宏在你include <assert.h>时没有被定义,这时断言功能开启;否则断言功能关闭。如:

#define NDEBUG
#include <assert.h> /* 此时断言功能关闭 */

你也大可不必在你的各个源文件中控制断言功能的开关,在编译器选项中同样可以定义NDEBUG宏,如gcc -DNDEBUG test.c,当然对于大的project,这些是应该放在Makefile中的,这样的结果就相当于在你所有#include <assert.h>的地方之前定义了NDEBUG宏,也就是说在每个编译单元中,断言功能都是关闭的。

assert宏看起来很简单,但是由于其是C标准库提供的接口,所以在实现的时候需要考虑的更加细致和全面一些。从上面的叙述上来看assert.h文件的结构应该大致如下:
#undef assert
#ifdef NDEBUG
#define assert(test) ((void)0)
#else
#define assert(test) …
#endif

我们可以很轻松的就拿出一个assert的实现版本:
/* NDEBUG not defined */
#define assert(test) if (!(test)) \
 fprintf(stderr, "Assertion Failed: %s, file %s, line %d\n", \
 #test, __FILE__, __LINE__); \

那么这个版本的实现可以接受不,答案是不能。原因有以下几点:
1) 这个实现中直接用到了stderr和fprintf,这两个符号都是在<stdio.h>中声明的,但是C标准库头文件基本上都是各自独立的,在<assert.h>中是不会再包含其他头文件的,那么这就要求使用assert的程序自己包含<stdio.h>,这显然不符合一个C标准库的基本要求;
2) assert宏应该最终展开为一个void expression,因为用户很可能在他们的程序中写出像(assert(0 < x), x < y)这样的代码来,而在上面的实现版本中,显然assert展开后不是一个void expression。

我们再来看看P.J.Plauger的实现版本:
/* NDEBUG not defined */
void _Assert(char *);
#define _STR(x) _VAL(x)
#define _VAL(x) #x
 
#define assert(test) (test) ? (void)0 \
 : _Assert(__FILE__ ":" _STR(__LINE__) " " #test)

/* in xassert.c */
#include <assert.h>
#include <stdio.h>

void _Assert(char *msg) {
 fprintf(stderr, "%s — assertion failed\n", msg);
 abort();
}
 
分析一下这一版本的实现,首先assert宏并没有直接调用任何库输出函数,而是调用了一个自己实现的函数_Assert,把向stderr输出诊断信息的活都交给了_Assert。_STR和_VAL是两个辅助宏,用来将__LINE__字符串化。这里比较难懂的地方就是_Assert(__FILE__ ":" _STR(__LINE__) " " #test)这一句,其实这个也很好理解。看看下面语句的执行结果:
printf("%s\n", "Hello" " " "Tony!");
执行上面语句你会看到Hello Tony!,这样一来实际上_Assert(__FILE__ ":" _STR(__LINE__) " " #test)就可以被理解为:
_Assert("THE_FILENAME_STRING" ":" "THE_LINE_STRING" " " "THE_TEST_STRING")

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats