Try   HackMD

2025q1 Homework4 (quiz3+4)

contributed by < LinMarc1210 >

作業書寫規範:

  • 無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
  • 文字訊息 (尤其是程式執行結果) 請避免用圖片來表示,否則不好搜尋和分類
  • 共筆書寫請考慮到日後協作,避免過多的個人色彩,用詞儘量中性
  • 不要在筆記內加入 [TOC] : 筆記左上方已有 Table of Contents (TOC) 功能,不需要畫蛇添足
  • 不要變更預設的 CSS 也不要加入任何佈景主題: 這是「開發紀錄」,用於評分和接受同儕的檢閱
  • 在筆記中貼入程式碼時,避免非必要的行號,也就是該手動將 c=cpp= 變更為 ccpp。行號只在後續討論明確需要行號時,才要出現,否則維持精簡的展現。可留意「你所不知道的 C 語言: linked list 和非連續記憶體」裡頭程式碼展現的方式
  • HackMD 不是讓你張貼完整程式碼的地方,GitHub 才是!因此你在開發紀錄只該列出關鍵程式碼 (善用 diff 標示),可附上對應 GitHub commit 的超連結,列出程式碼是為了「檢討」和「便於他人參與討論」
  • 留意科技詞彙的使用,請參見「資訊科技詞彙翻譯」及「詞彙對照表
  • 不要濫用 :::info, :::success, :::warning 等標示,儘量用清晰的文字書寫。:::danger 則僅限授課教師作為批注使用
  • 避免過多的中英文混用,已有明確翻譯詞彙者,例如「鏈結串列」(linked list) 和「佇列」(queue),就使用該中文詞彙,英文則留給變數名稱、人名,或者缺乏通用翻譯詞彙的場景
  • 在中文敘述中,使用全形標點符號,例如該用「,」,而非 ","。注意書名號的使用,即 ,非「小於」和「大於」符號
  • 避免使用不必要的 emoji 字元

第三週 - 測驗 1

首先理解 mpi_t 這個結構,他定義成 mpi_t[1],這樣之後變數直接宣告成 mpi_t a 時,a就直接是個指向 mpi_t 的指標了,因為長度為 1 的陣列,直接使用陣列名字時就相當於取得 &mpi_t[0] 。不知道為什麼特別這樣做,但我想是為了減少每次宣告 mpi_t * 還需要額外給指標一個已分配的記憶體。此外這個結構放了無號 32-bit 的整數指標作為資料陣列,並且後續將 mp_bitcnt_t 作為 unsigned 的型別使用。

/* mpi: Multi-Precision Integers */
typedef struct {
    uint32_t *data;                           
    size_t capacity;
} mpi_t[1];

typedef size_t mp_bitcnt_t;

再來先理解一下記憶體相關的函式操作:

  • mpi_init: 初始化結構成員
  • mpi_clear: 釋放結構裡的 data
  • mpi_enlarge: 若新的 capacity 大於 rop 的,則更新,並且重新分配 rop->data 的記憶體為 capacity * 4,因為 data 採用 uint32_t ,一個整數值代表 4 bytes。所以就是新增大小到給定的 capacity 並將新增的 data 空間初始化為 0 。
  • mpi_compact: 從 data 陣列最後面檢查回來,如果 capacity != (size_t) -1,也就是 data 裡面還有東西,則繼續運行,後面則重新分配一次 capacity 與 data 的記憶體,讓 data 空間符合實際存放資料的數量而不會有多餘的。