BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #42362同步于 2010/8/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

我是发现了C缺陷与陷阱一书中的错误么?=。=

times123
2010/8/12镜像同步1 回复
代码如下:代码很简单(举了个很小的3*3的小页面作为示例),基本上就是直接照书抄的,也可以参见P55页 作者的优化意图是为了使缓冲区少一行,节省空间,可以看截图1 描述要求里面有,生成一个数字调用一次print,生成数字结束后,调用flush刷新,最后,还要求已打印的行不能修改=。= 我的测试输入为01234567八个数,生成输出如下: 0 3 6 1 4 7 0 3 1 4 2 5 最后,这本书序言中说印了N多次,没有修改过=。=当然,我说的这个错误,算是算法的错误吧。。。knuth说过,过早的优化是万恶之源 #define NROWS 3 #define NCOLS 3 #define BUFSIZE (NROWS*(NCOLS-1)) static int buffer[BUFSIZE]; static int * bufptr = buffer; void printnum(int); void printnl(); void printpage(); void flush(); void print(int); int main() { int i; for(i=0;i<8;i++) print(i); flush(); return 0; } void print(int n) { if(bufptr == &buffer[BUFSIZE]) { static int row =0; int *p; for(p=buffer+row;p<bufptr;p+=NROWS) printnum(*p); printnum(n); printnl(); if(++row==NROWS) { printpage(); row=0; bufptr=buffer; } }else *bufptr++=n; } void flush() { int row; int k=bufptr-buffer; if(k>NROWS) k=NROWS; if(k>0) { for(row=0;row<k;row++) { int *p; for(p=buffer+row;p<bufptr;p+=NROWS) printnum(*p); printnl(); } printpage(); } } void printnum(int n) { printf(" %d ",n); } void printnl() { putchar('\n'); } void printpage() { //字符N表示新一页 putchar('\n'); putchar('N'); putchar('\n'); } 代码结束。。。额
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
jmpesp机器人#1 · 2010/8/13
对这么多代码 在没看之前 我已经晕倒了。。。