Re: [問題] C語言列舉、指標、標準問題 (x6)
※ 引述《EdisonX (閉上眼的魚)》之銘言:
: 這陣子接了小家教,講義從頭到尾自己編,編的過程有些概念其實不是很確定,
: 依慣性作法,家教結束後把問題擠在一起一次提出,
: 請各位版友不吝指教。
: ------
: 1. 列舉(enum)之變數能否以常數設初始值?
: enum E1{x, y, z};
: enum E1 var = 0;
: 我翻以前的書是寫不行,但手邊 compiler 是都可以過。
不合法,不能將int轉換為E1
: 另外想請教 C++ 下面這兩個 enum 是不是合法的 (它在 C 是不合法的)
: enum E1{x,y,z};
: enum E2{a,b,x};
: 關鍵在於 x 被兩個 enum 當作列舉元,C 沒有 :: 概念,但 C++ 有,
: 不知上面這段是否合法?
emumerator的scope和整個enum一樣,所以如果E1和E2在同個scope裡面,那就不合法,
但是這樣是ok的:
enum e1 { x = 1 };
namespace foo { enum e2 { x = 2 }; }
x; // 1
foo::x; // 2
: 2. 針對 C string library 而言,諸如 strchr, strstr, strtok... etc,
: 標準裡是否已有明確規定,函式必須對輸入引數為 NULL 時做處理避免發生錯誤?
C標準沒寫,更正:
推
09/17 10:35,
09/17 10:35
: 3. bsearch 為 stdlib 之二分搜尋法,但二分搜尋法會隨著問題不同導致寫法不同,
: 請教若鍵值存在時,
: C Stdlib library 裡之 bsearch 是否有保證找到的會是第一個 key-value?
否,C標準如此說:
The bsearch function returns a pointer to a matching element of the array,
or a null pointer if no match is found. If two elements compare as equal,
which element is matched is unspecified.
你可以用std::equal_range(...).first
: 4. NULL 本身做「取址」會怎樣?
: 這是在寫指標範例時,為了清楚表達寫下的 code ,
: 但細思,若有一個步驟為對 NULL 做取址,是否合法?
: int *Ptr = NULL;
: printf(" Ptr = %08x\n", Ptr);
: printf("&Ptr = %08x\n", &Ptr);
: printf("*Ptr = %08x\n", *Ptr);
: 這點不知道在標準裡面有沒有明文規定?還是讓 compiler 自己搞?
第一個printf OK,印出null pointer真正的value
第二個也OK,印出Ptr這個lvalue的位置,
第三個是UB (dereference null pointer)
: 5. 有沒有 float32 / float64 之資料型態?
: C99 後多了 stdint.h ,裡面有 uint32_t 等資料型態,
: 針對浮點數,是否只能以 typedef 方式去做而已?
: typedef 的話我想不透有沒有辦法轉交由 macro 判定,
: 不知有沒有人有經驗?
據我所知是沒有...不過不太懂你想問什麼._.?
: 6. 一律以動態配置方式建立實體資料
: 這個有點像是資料結構的問題了。假定為 array。
: 若是有含「交換」動作的 sort algorithm ,
: 若資料內容是一份屬性不少的 struct ,
: 在做 swap 時會花不少時間。
: 假設欲建立起 struct Data array[N],
: 個人比較推用下面這種方式 < 只是示意而已,malloc 部份會做優化 >
: // 先建立 N 個指標
: struct Data** Array = \
: (struct Data**)malloc(sizeof(struct Data*) * N );
: // 每個指標再用 malloc 做實體配置
: for(i=0; i<N; ++i) {
: Arr[i] = (struct Data*)malloc(sizeof(struct Data));
: // Read Data
: }
: 好處是到時候要交換時只要對指標做交換,不用對整份 struct 做交換。
: 壞處當然也不少,像是會平白無故多了 pointer 佔空間、coding 複雜不易維護。
: 針對這種設計模式,我想問的是,在做「尋訪」時,會由於是 pointer to pointer
: 所以讀寫時間會比一般的直接寫入還慢嗎? 直覺是會,在此做確認。
: ( 我是覺得這種差異上的成本應該是比不上 swap 的成本來得高 )
要看你的memory access pattern,
因為Arr的每一個Data*指標所指到的空間可能不是連續的,讓prefetcher無法預測,
這樣cache miss造成的performance hit可能比你在連續空間內sort後循序讀取還要高,
尤其當你的資料量很大且讀的次數比sort的次數多很多的時候
: ------
: 問題有點多,煩請不吝賜教,小弟感激不盡 !!
個人淺見僅供參考,有錯歡迎指正
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.252.42
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 00:34)
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 00:49)
推
09/17 01:24, , 1F
09/17 01:24, 1F
→
09/17 01:24, , 2F
09/17 01:24, 2F
→
09/17 01:26, , 3F
09/17 01:26, 3F
→
09/17 01:26, , 4F
09/17 01:26, 4F
推
09/17 02:25, , 5F
09/17 02:25, 5F
→
09/17 02:27, , 6F
09/17 02:27, 6F
推
09/17 10:35, , 7F
09/17 10:35, 7F
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 10:56)
→
10/05 06:56, , 8F
10/05 06:56, 8F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 3 之 4 篇):