Try   HackMD

2019q3: 回顧 Homework 1 / 2

《返校》台詞:「你是忘記了,還是害怕想起來?」


  • colinyoyo26
  • 檢討事項 : 擴充到負數以及化簡
  • 補充資訊 : ^x == 0 變 normal case
#include <stdbool.h>
bool func(int x) {
    return ((x & -x) == x) ^ ((x & -x) == -x );      
}

  • kksweet8845
  • 檢討事項 :
    • 數值處理 : 推論方式有錯誤
  • 補充資訊 :

  • uccuser159
  • 檢討事項 :
    • C99為什麼需要 function designator,考量點為何?
    • 解釋Driver & q_reverse表達的修正
  • 補充資訊 :
  • [ ]function designator考量點
    考慮以下程式:
#include <stdio.h>
int (*fptr1)(int);

int test1(int a){
        a = a + 1;
        return a;
}

int main() {
        fptr1 = test1;
        printf("test1:%x, fptr1:%x, *fptr1=%x\n", test1, fptr1, *fptr1);
        printf("&test1: %x, &fptr1: %x\n", &test1, &fptr1);
        return 0;
}

/*
test1:400593, fptr1:400593, *fptr1=400593
&test1: 400593, &fptr1: 601048
*/

test1 是一個 int type 的函式 : int (int)

fptr1 是一個 pointer to function with returning type : int(*)(int)

*fptr1 因為 function pointer(fptr1) 搭配 * 運算子的運算視為 function designator ,且 fptr1 有 returning type,所以轉變成pointer to function returning type : int (int)

若沒有 function designator ,在 *fptr1 時會抓到錯誤的程式段。
以上面的例子來說,會抓到 empty function。

Reference
-Why we need function designator

A driver in software provides a programming interface to control and manage specific lower level interface that is often linked to a specific type of hardware, or other low-level service.

在 Readme 中提到:
scripts/driver.py : The C lab driver program, runs qtest on a standard set of traces

Driver 扮演是一個操作 qtest 執行一連串的 task (例如:q_insert_head . q_free 等等)的角色。

  • q_reverse
void q_reverse(queue_t *q)
{
    if (q == NULL || q->size == 0 || q->size == 1)
        return;
    list_ele_t *cur = q->head->next;
    q->head->next = NULL;
    list_ele_t *temp;

    q->tail = q->head;
    while (cur != NULL) {
        temp = cur->next;
        cur->next = q->head;
        q->head = cur;
        cur = temp;
    }

想法是原本 queue 的指向關係為 A → B → C → D → E → NULL
reverse 即是將關係反過來:原本 A->next = B 改成 B->next = A

最一開始先將 cur 指向 B , q->head->next 指向 NULL (即 A ->next = NULL),再將 q->tail 換成 q->head (q->tail 指向 A)

再來就是換個別 node 的 next 關係

STEP1. 儲存 cur->next 先儲存起來
STEP2. 先讓 cur 指向我們所想對調的 next 關係 (cur 指向 B , B->next 要指向 A)
STEP3. 再將 q->head 更新為 cur (B → A → NULL)
STEP4. 最後更新 cur 為下一個要對調 next 關係的 node