亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123
最近訪問板塊 發(fā)新帖
樓主: vupiggy
打印 上一主題 下一主題

[C] switch-case 非常規(guī)用法拾零 (1. 絕無原創(chuàng) 2. 非常重視代碼規(guī)范者勿入) [復制鏈接]

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
21 [報告]
發(fā)表于 2010-12-18 05:36 |只看該作者
先說coroutine的狀態(tài)

我上面的帖說coroutine必須提供一個機制來區(qū)分ternimate和yield。
lua有多返回值, 而python除了多返回值, 還有異常。

可能沒說清楚, 我再說具體一點。
1. 代碼中確實有個錯誤, 在10次調用后
2. 不是說C語言就解決不了這個問題
C確實不支持多返回值, 但需要多返回值時, C肯定有迂回的辦法:

  1. struct { T1 y1; T2 y2; } f(P x);
  2. void f(P x, T1* y1, T2* y2);
復制代碼
就是ugly而已。
一般情況下, 我設計api時都會盡可能不使用傳出參數(shù), 但有時候真沒辦法。



再看啟動函數(shù)
留意上面的
  1. coroutine_create( ..., void (*f)(void* x), void* x);
復制代碼
結合
  1. pthread_create( ..., void* (*f)(void* x), void* x);
復制代碼
這是C語言另一個問題: 沒有一種參數(shù)類型可以直接代表任意"函數(shù)參數(shù)"。
當需要的時候, 上面就是一個典型的迂回方式。

注意偽代碼中, rc4_stream是unsigned char rc4_stream(char const* key, size_t len);
而實際代碼中, rc4_stream需要是void rc4_stream(void* x);
范化的解決辦法就是:


  1. typedef struct
  2. {
  3.       char const* key;
  4.       size_t len;
  5. } rc4_arg_t;

  6. void rc4_stream(void* x)
  7. {
  8.       rc4_arg_t* arg = (rc4_arg_t*)x;
  9.       rc4_stream(arg->key, arg->len);
  10. }

  11. rc4_arg_t arg = { "1212", 4 };
  12. coroutine_create( ..., &arg);
復制代碼
實際代碼中只是取巧使用strlen來減少一個參數(shù)。
對更一般的例子, 就必須迂回一次。


最后看yield的返回值

yield返回什么?
為了讓那幾個coroutine的api更范化一點, 我選擇和pthread相同的, 返回void*。
若需要的返回值比void*窄, 直接通過void* 的值返回。
否則返回一個指向結構體的指針 —— 對更復雜的例子, 就需要再如此這般的迂回一次, 運氣不好還需要動態(tài)分配。

所有的這些加起來, 得到的結果就是在C中使用coroutine會非常麻煩, 能避免,就盡量避免。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
22 [報告]
發(fā)表于 2010-12-18 05:58 |只看該作者
本帖最后由 OwnWaterloo 于 2010-12-18 06:08 編輯

你告訴他好了~  順便也告訴我"充其量"應該如何翻譯……

原文我很早以前就看過。 當時對coroutine理解不深, 所以肯定看得不夠仔細。
再看老文, 總是缺乏耐心的……

例子當然是需要簡化的, 但不能把問題的關鍵給簡化了。
1. 生成不同的coroutine實例
2. 簡化腦力計算, 更自然的表達算法
否則, 腦力計算出掛起點和context, 其實不用coroutine也可以編程了。

所以, "從他列出的代碼來看", 我的評價就是上面的, 只是讓語法稍微好看一點。
簡單的沒必要用, 復雜的又用不上。
可能也就"中不溜秋"的應用可以玩一玩, 但樸質的寫法也一定可以完成的。
至于維護性就不好說了。


你提到putty的實現(xiàn)代碼通過傳入context的指針完成以解決static(本質是多個不同coroutine實例)的問題。
能否演示一下?
希望就用上面那個lua和rc4的例子, 而putty可能相關上下文更多。
我就偷個懶, 不去深研他的原文啦~


PS: 上面的使用fiber的程序還存在一些問題。

因為rc4的例子很特殊, 是一個無限循環(huán)中不斷yield, 不需要terminate的判斷。
本來想再修改一下, 改為:

  1. unsigend char rc4_stream(char const* filename, char const* key, size_t len);
復制代碼
每次產生一個byte的密文。
也有一個很正當?shù)男枨螅?因為將rc4算法對密文再執(zhí)行一次恰好就得到明文, 所以這其實是一個增量"解密"程序……
用戶不需要完整的明文, 只需要前面一部分, 可以調用幾次rc4_stream并奪回控制權, 根據(jù)所得明文看是否需要繼續(xù)解密余下密文。

同時還可以演示將參數(shù)打包到一個void*; 判斷coroutine狀態(tài)這些問題 —— 能體現(xiàn)使用coroutine不如其他語言那么爽。

但是……  我想上面的例子應該能體現(xiàn)coroutine避免腦力計算了。
而且, 手確實很僵啊……   銀魂在等待啊……   看銀魂去了……
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP