免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: OwnWaterloo
打印 上一主题 下一主题

[C] 思考题:语言是工具?重要是思想?那如何表达思想?(修改版) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
21 [报告]
发表于 2011-10-26 15:26 |显示全部楼层
编程不是体力活,它是创作
狗气球 发表于 2011-10-26 15:21


有这么想,但不敢这么说

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
22 [报告]
发表于 2011-10-26 15:50 |显示全部楼层
回复 67# mirnshi

自然必须有办法,还不止一种,实现。

C/C++都有不少coroutine的库。 在Windows上,有一套fiber的函数; 在posix上貌似有ucontext还是什么的。
但无论它们的代价再怎么低(fiber切换只有10来个指令), 还是不适合在循环里这么搞。


如果用纯C/C++, 可以这么搞:

  1. typedef struct
  2. {
  3.       unsigned i, j;
  4.       unsigned char s[256];
  5. } rc4_t;

  6. void rc4(rc4_t* self, char const* key, size_t len)
  7. {
  8.       unsigned char* S = self->s;

  9.       for (unsigned i=0; i<256; ++i)
  10.             S[i] = i;
  11.       for (unsigned i=0, j=0; i<256; ++i)
  12.       {
  13.             j = (j+key[i%len]+S[i]) % 256;
  14.             std::swap(S[i], S[j]);
  15.       }
  16.       self->i = self->j = 0;
  17. }

  18. unsigned rc4_next(rc4_t* self)
  19. {
  20.       unsigned* i = self->i;
  21.       unsigned* j = self->j;
  22.       unsigned char* S = self->s;
  23.       unsigend k;

  24.       *i = (*i+1) % 256;
  25.       *j = (*j+S[*i]) % 256;
  26.       k = S[*i]; S[*i] = S[*j]; S[*j] = k;

  27.       return S[ (S[*i]+S[*j]) % 256 ];
  28. }
复制代码
客户代码就可以:
rc4_t g;
rc4(&g, key, len);
for ( ... ) {
// 这里由用户决定要加密什么
// 当需要一个加密流字节时
unsigned byte = rc4_next(&g);
}


但这其实就是在人肉实现coroutine, 然后再表达rc4算法。
就像是用亲戚关系的具体定义(父亲的亲兄弟的儿子), 而非直接用一个词(堂兄)表达。

人肉实现时需要保存哪些局部状态、 哪些是挂起点(这个例子中挂起点很简单,因为最后是一个无限循环) —— 这种分析很容易出错。
以前与starwing83讨论过是否可以将这种人肉翻译自动化一些, 不过他貌似没什么兴趣, 我也很懒……  就此作罢了……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
23 [报告]
发表于 2011-10-26 17:00 |显示全部楼层
本帖最后由 OwnWaterloo 于 2011-10-26 17:03 编辑

回复 66# 狗气球

养的累……  噗……  这不是养的累,而是不敢养啊……

其实吧,无论什么属性,只要发挥到了极致,总归会让人好奇吧?
那动画出来了么自然是会看看啦,而且动画还很不错的说……

BTW,如果萌ヤンデレ,或者反感后宫、N线齐开什么的, 推荐《我和妹妹和青梅竹马和同级生和前辈和后辈在那风华正茂之时》……
绝对比coroutine神马的更给力

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
24 [报告]
发表于 2011-10-26 17:15 |显示全部楼层
回复 70# starwing83

居然没有@就把你给招来了……   但是我知道其中原因,你闲得慌的原因,嘿嘿……
你在说哪个? 顶楼的还是后来说coroutine的?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
25 [报告]
发表于 2011-10-26 17:16 |显示全部楼层
回复 72# starwing83

不是cpp2lua/lua2cpp什么的东西哦?
要我查聊天记录吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
26 [报告]
发表于 2011-10-26 17:40 |显示全部楼层
本帖最后由 OwnWaterloo 于 2011-10-26 17:41 编辑

回复 76# starwing83

我就是说的今天闲。因为昨天貌似扫到某人的某条状态了……

>> 关键在于你想做什么,而不是你需要什么函数。
我想要的就是single dispatch、 double dispatch以及multi dispatch。
第1个可以在C中比较容易的人肉出来; 而在C++中自动实现。
后面的……  想要人肉都不容易……
C++有提出支持multi dispatch —— 提出人是BS! —— 但没有被C++11采纳……

至于如何提出这个问题,且又不剧透,我已经尽力了……
我给出一些较为具体的东西是为了, 比如 rect 有人会 (top,bottom,left,right) 有人会 (top,left,height,width), 我想避免这种不必要的干扰。
但是,产生误导了?


后面还提到coroutine。
也许我的例子不恰当?
但适合用coroutine、single dispatch与double dispatch解决的问题很普遍的吧?


至于你说的改变shape的定义方式, 请看
你这个是直接把算法改了,和思想语言什么的没有什么关系。再说了,不是所有适合OO的问题都能这么通过改算法一劳永逸的解决的。
MMMIX 发表于 2011-10-26 11:12


你这是纯抬杠啊!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
27 [报告]
发表于 2011-10-26 17:50 |显示全部楼层
回复 76# starwing83

为什么你这是在抬杠, 我给你举个例子。

问题: 两人相距10km,相向而行;A速度3km/h, B速度2km/h; 在他们出发时有一只蚊子在A处,往B飞; 与B相遇后立即往A飞, 如此往复, 速度5km/h。
问两人相遇后, 蚊子飞了多远?

这问题,确实思路灵活的小学生就可以做出来。
但要求、或者说引导本科生用微积分去解,也不算过分吧?

为了例子尽可能短小以及容易实现,可能确实会被一些巧妙的方法解出来,而显得题目很蛋疼。
这是比较该尬的事情……
但感受到巧妙的成就感后不去思考题目本身想表达的含义,就亏了……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
28 [报告]
发表于 2011-10-26 17:53 |显示全部楼层
回复 77# starwing83

coroutine与 cpp2lua/lua2cpp 有神马关系……
你说的那个只是分析 c/c++ 的 struct 定义吧? 能分析c/c++语意么?
而且……  我也不想在 c或者c++ 上面添东西了……  c不适合, 而c++已经很乱了……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
29 [报告]
发表于 2011-10-26 21:03 |显示全部楼层
回复 82# 幻の上帝

这吐槽

确实…… 若用sw若想用英文描述就麻烦了……
改用subroutine?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
30 [报告]
发表于 2011-10-26 21:05 |显示全部楼层
回复 84# 三月廿七

C++增加引用绝对不是为了摒弃指针……  不要被那些"C++里使用引用比指针更好"的言论蒙蔽了……
记得(好像出自设计与演化那书)是为了让用户定义类型能更内建类型。

比如,实现一个任意精度整数类: integer 。
integer a, b;

有引用的情况下, 两数相加可以 a+b 。
无引用的情况下, 就只能 &a + &b ……

如此一来……  似乎 c = a+b 要写成  c = &(&a+&b) 才可以……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP