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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1687 | 回復: 0
打印 上一主題 下一主題

請教一個回調函數(shù)與用戶數(shù)據(jù)交互的問題。 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-04-06 23:48 |只看該作者 |倒序瀏覽
實際情況是這樣的,我想寫一個某格式文件的parser,當parser運行時,將調用使用者自定義的callback,一般而言,callback會將parse_data(parse出來的data)整理成user_data(使用者的data),這樣就可將parse與使用者的業(yè)務邏輯在代碼上分開。但是遇到一個問題,看如下的示例代碼吧。代碼中我將parse的動作,用一個簡單的while loop來代替了。ya_my_cbk_3中,我將對user_data的搜集用一個簡單的求和代替了,實際情況parse會做正常的parse文件的動作,搜集user_data可能會將user_data放到一個大的數(shù)據(jù)結構比如list中去。
parse.h

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. #ifndef PARSE_H_INCLUDED
  3. #define PARSE_H_INCLUDED
  4.   
  5. typedef int parse_data_t; // parse_data_t可能比較復雜,這里只用int來舉例
  6. typedef void (*cbk_t) (parse_data_t, void*); //callback type也可能比較多,這里只用一個
  7.   
  8. // 三個默認的callback
  9. cbk_t cbk_1 = 0;
  10. cbk_t cbk_2 = 0;
  11. cbk_t cbk_3 = 0;
  12.   
  13. // 暴露給使用者重定義callback
  14. void set_cbk_1(cbk_t cbk) {
  15.      cbk_1 = cbk;
  16. }
  17. void set_cbk_2(cbk_t cbk) {
  18.      cbk_2 = cbk;
  19. }
  20. void set_cbk_3(cbk_t cbk) {
  21.      cbk_3 = cbk;
  22. }
  23.   
  24. // parse的類型,實際可能有其它成員,這里只放了幾個user_data,為了能在parse時方便的調用到。
  25. typedef struct {
  26.      void* user_data_1;
  27.      void* user_data_2;
  28.      void* user_data_3;
  29. } parse_t;
  30.   
  31. //簡單初始化,這一步沒有也可以。
  32. void parse_init(parse_t* parse) {
  33.      parse->user_data_1 = 0;
  34.      parse->user_data_2 = 0;
  35.      parse->user_data_3 = 0;
  36. }
  37.   
  38. // parse過程,用一個簡單的循環(huán)來模擬,當cbk_N不是默認值時,調用使用者自定義的callback.
  39. void parse_run(parse_t* parse) {
  40.      int i = 0;
  41.      while(i++ < 100) {
  42.          if (i == 11) {
  43.              if (cbk_1) {
  44.                  cbk_1((parse_data_t)i, parse->user_data_1);
  45.              }
  46.          } else if (i == 21) {
  47.              if (cbk_2) {
  48.                  cbk_2((parse_data_t)i, parse->user_data_2);
  49.              }
  50.          } else if (i > 0 &&  i < 11) { //parse在這里會調用多次callback
  51.              if (cbk_3) {
  52.                  cbk_3((parse_data_t)i, parse->user_data_3);
  53.              }
  54.          }
  55.      }
  56. }
  57.   
  58. #endif // PARSE_H_INCLUDED
復制代碼
main.c

  1. //假設使用者的代碼在main.c里面
  2. //////////////////////////////////////////////////////////////////////////////////////
  3. #include <stdio.h>
  4. #include "parse.h"
  5.   
  6. //自定義的callback,將parse_data整理成user_data
  7. void my_cbk_1_2 (parse_data_t parse_data, void* user_data) {
  8.      // just an example
  9.      // simply assign parse_data to user_data;
  10.      *(parse_data_t*)user_data = parse_data;
  11. }
  12.   
  13. // 下面兩個callback在parse_run時會被多次調用。
  14. // 其中一個callback
  15. // 如果將user_data送進去,最后user_data只會是最后parse到的那個值
  16. // assign parse_data to user_data every callback invoking
  17. void my_cbk_3 (parse_data_t parse_data, void* user_data) {
  18.      *(parse_data_t*)user_data = parse_data;
  19. }
  20.   
  21.   
  22. // 另外一個callback,模擬將user_data搜集起來。
  23. // yet another callback to add user_data_3 to sum_for_user_data_3
  24. int sum_for_user_data_3 = 0;  //就是這個讓我心痛的全局變量哇~~~~
  25. void ya_my_cbk_3(parse_data_t parse_data, void* user_data) {
  26.      *(parse_data_t*)user_data = parse_data;
  27.      sum_for_user_data_3 += *(int*)user_data;
  28. }
  29.   
  30. int main()
  31. {
  32.      set_cbk_1(my_cbk_1_2);
  33.      set_cbk_2(my_cbk_1_2);
  34.      //set_cbk_3(my_cbk_3); //如果用這個cbk給cbk_3,最后user_data_3只會是parse過程的最后一個值
  35.      set_cbk_3(ya_my_cbk_3); //如果用這個cbk給cbk_3,就要用那個全局的變量。
  36.   
  37.      int my_user_data_1;
  38.      int my_user_data_2;
  39.   
  40.      int my_user_data_3;
  41.   
  42.      parse_t parse;
  43.      parse_init(&parse);
  44.      parse.user_data_1 = &my_user_data_1;
  45.      parse.user_data_2 = &my_user_data_2;
  46.      parse.user_data_3 = &my_user_data_3;
  47.      parse_run(&parse);
  48.   
  49.      printf("my_user_data_1 : %d\n", my_user_data_1);
  50.      printf("my_user_data_2 : %d\n", my_user_data_2);
  51.      //printf("my_user_data_3 : %d\n", my_user_data_3);
  52.      printf("sum_for_user_data_3 : %d\n", sum_for_user_data_3);
  53.   
  54.      return 0;
  55. }
復制代碼
上面代碼可以編譯通過。我本意是希望使用者可以自定義callback來使用parse_data,將他所需的parse_data整理成user_data。如果callback只會調用一次,我可以將user_data在parse里各放一份引用。
但當同一個callback被調用多次時(比如while循環(huán)中的那個 else if (i > 0 &&  i < 11)),那個user_data會被不停地覆蓋,但又不能跑多少次callback就申明多少個user_data,因為到底跑多少次callback是不一定的事。所以每次callback要將user_data搜集起來,可看來看去,這個搜集到的地方,只能是全局變量。
  
我不想讓user_data只能被搜集到全局變量,是哪里出錯了嗎?
求教啊
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP