OK論壇

 找回密碼
 註冊
查看: 1972|回復: 6

[疑問] [已解決]源碼堆疊的function用法

[複製鏈接]
  • TA的每日心情
    開心
    2019-6-13 09:37 PM
  • 簽到天數: 705 天

    連續簽到: 3 天

    [LV.9]以壇為家II

    發表於 2017-4-27 13:59:20 | 顯示全部樓層 |閱讀模式
    本帖最後由 jqkeric11 於 2017-4-29 09:15 PM 編輯
    1. /// Returns the script_data at the target index
    2. #define script_getdata(st,i) ( &((st)->stack->stack_data[(st)->start + (i)]) )
    3. /// Returns if the stack contains data at the target index
    4. #define script_hasdata(st,i) ( (st)->end > (st)->start + (i) )
    5. /// Returns the index of the last data in the stack
    6. #define script_lastdata(st) ( (st)->end - (st)->start - 1 )
    7. /// Pushes an int into the stack
    8. #define script_pushint(st,val) push_val((st)->stack, C_INT, (val))
    9. /// Pushes a string into the stack (script engine frees it automatically)
    10. #define script_pushstr(st,val) push_str((st)->stack, C_STR, (val))
    11. /// Pushes a copy of a string into the stack
    12. #define script_pushstrcopy(st,val) push_str((st)->stack, C_STR, aStrdup(val))
    13. /// Pushes a constant string into the stack (must never change or be freed)
    14. #define script_pushconststr(st,val) push_str((st)->stack, C_CONSTSTR, (val))
    15. /// Pushes a nil into the stack
    16. #define script_pushnil(st) push_val((st)->stack, C_NOP, 0)
    17. /// Pushes a copy of the data in the target index
    18. #define script_pushcopy(st,i) push_copy((st)->stack, (st)->start + (i))
    複製代碼
    我再查看script.c時候,發現腳本語法會使用到堆疊,例如 script_pushint(st,0);
    但是不懂的是 該如何使用的時機以及用法   
    能不能舉一些例子 ?
    回復

    使用道具 舉報

  • TA的每日心情

    2018-8-8 04:07 PM
  • 簽到天數: 267 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2017-4-27 14:08:09 | 顯示全部樓層
    使用到「後進先出」時,
    或是需要使用「鏈結」這種資料結構時
    就會用到堆疊了
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2019-6-13 09:37 PM
  • 簽到天數: 705 天

    連續簽到: 3 天

    [LV.9]以壇為家II

     樓主| 發表於 2017-4-27 14:33:47 | 顯示全部樓層
    Ceres8154 發表於 2017-4-27 02:08 PM
    使用到「後進先出」時,
    或是需要使用「鏈結」這種資料結構時
    就會用到堆疊了
    1. BUILDIN_FUNC(getiteminfo)
    2. {
    3.         unsigned short item_id,n;
    4.         struct item_data *i_data;

    5.         item_id        = script_getnum(st,2);
    6.         n        = script_getnum(st,3);
    7.         i_data = itemdb_exists(item_id);

    8.         if (i_data && n <= 16) {
    9.                 int *item_arr = (int*)&i_data->value_buy;
    10. #ifndef RENEWAL
    11.                 if (n == 16)
    12.                         script_pushint(st,0);
    13.                 else
    14. #endif
    15.                 script_pushint(st,item_arr[n]);
    16.         } else
    17.                 script_pushint(st,-1);
    18.         return SCRIPT_CMD_SUCCESS;
    19. }
    複製代碼
    我拿這當例子好了
    getiteminfo 這指令裏頭有這三個堆疊
    script_pushint(st,0);
    script_pushint(st,item_arr[n]);
    script_pushint(st,-1);

    這應該是「鏈結」 ?
    然後那後面的引數又為何這樣給呢?
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    擦汗
    2014-8-13 07:23 AM
  • 簽到天數: 109 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2017-4-29 15:50:48 | 顯示全部樓層
    jqkeric11 發表於 2017-4-27 02:33 PM
    我拿這當例子好了
    getiteminfo 這指令裏頭有這三個堆疊
    script_pushint(st,0);[/backcolor ...

    script_pushint = 輸出數字
    val = 要輸出的值

    script_pushint(st, val);


    至於item_arr[n]是指向item_data的結構
    n = 0 的時候是售價之後要依此類推 ...

    0 =        int value_buy;
    1 =         int value_sell;
    2 =        int type;
    3 =        int maxchance;
    4 =        int sex;
    5 =        int equip;
    6 =        int weight;
    .
    .
    .
    .

    以上是小弟的小小見解
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2019-6-13 09:37 PM
  • 簽到天數: 705 天

    連續簽到: 3 天

    [LV.9]以壇為家II

     樓主| 發表於 2017-4-29 21:15:02 | 顯示全部樓層
    sense 發表於 2017-4-29 03:50 PM
    script_pushint = 輸出數字
    val = 要輸出的值

    喔喔,如果是這樣我就了解了
    因為我當初看C語言 資料結構時候
    Push 是存入
    Pop是 取出
    所以我一直想說
    script_pushint 是 存入 (因為他名稱有Push)
    明明存入的動作,卻是讀取資料
    你這樣講說是取出的話那我就理解了
    謝謝 S 大

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    擦汗
    2014-8-13 07:23 AM
  • 簽到天數: 109 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2017-4-29 23:02:54 | 顯示全部樓層
    jqkeric11 發表於 2017-4-29 09:15 PM
    喔喔,如果是這樣我就了解了
    因為我當初看C語言 資料結構時候
    Push 是存入

    原來是被字面給誤導了

    存入的話就是
    數字: script_getnum(st, val);
    字串: script_getstr(st, val);
    變量: script_getref(str, val)
    這邊的val是指第n個參數,基本上都是2開始(這應該不需要解釋的)

    比如
    BUILDIN_FUNC(getitem)
    會看到需要至少兩個參數
    1. getitem <item id>,<amount>{,<account ID>};
    複製代碼
    然後
    1. BUILDIN_DEF(getitem,"vi?"),
    複製代碼
    v = item id / item name
    i = amount
    ? = account ID

    v 代表的是數字或字串
    i = 數字
    ? = 可帶可不帶

    補充:
    s = 字串
    * = 陣列
    r = 變量名稱
    會用到的應該就是以上這些

    輸出
    script_pushint(st, val);

    評分

    參與人數 1積分 +30 現金 +30 積極性 +30 收起 理由
    -樂- + 30 + 30 + 30 我很贊同

    查看全部評分

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2019-6-13 09:37 PM
  • 簽到天數: 705 天

    連續簽到: 3 天

    [LV.9]以壇為家II

     樓主| 發表於 2017-4-30 03:40:25 | 顯示全部樓層
    sense 發表於 2017-4-29 11:02 PM
    原來是被字面給誤導了

    存入的話就是

    摁摁
    感謝又貼心補充一些東西^^
    這樣更了解這些用途了



    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-4-26 03:58 AM , Processed in 0.052630 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表