[問題] 轉型and function pointer

看板C_and_CPP作者 (corn)時間14年前 (2009/10/14 23:45), 編輯推噓12(12024)
留言36則, 4人參與, 最新討論串1/1
http://codepad.org/hlovKWlF 這是我在網路上,抓來研究改的code 1.第7行不寫似乎不行 中間牽扯到許多轉型,可是看不出個所以然! 2.第44行 呼叫時 items[0]->print(items[0]); ^^^ 為什麼傳的參數不是寫 &items[0] 函數宣告不是這樣嗎? void printBook(struct SaleItem *book) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.133

10/14 23:45, , 1F
第七行,原code是寫int size
10/14 23:45, 1F

10/14 23:56, , 2F
是第七還是第八行?
10/14 23:56, 2F

10/14 23:57, , 3F
你第二個問題 item型態是 *[]喔不是只有*
10/14 23:57, 3F

10/15 00:01, , 4F
1.不就單純宣告一個function pointer 跟轉型無關
10/15 00:01, 4F

10/15 00:29, , 5F
第二個問題,我沒注意看到[],抱歉
10/15 00:29, 5F

10/15 00:30, , 6F
第一個問題問的是第一行,int a
10/15 00:30, 6F

10/15 00:32, , 7F
咦?不對,44行只有*阿
10/15 00:32, 7F

10/15 00:48, , 8F
看宣告 struct SaleItem *items[1];
10/15 00:48, 8F

10/15 00:49, , 9F
你傳item[0] type就是 *了 item本身是*[1]
10/15 00:49, 9F

10/15 00:58, , 10F

10/15 00:59, , 11F
上面貼錯
10/15 00:59, 11F

10/15 01:01, , 12F
那第一個問題是什麼原因?
10/15 01:01, 12F

10/15 01:02, , 13F
第一個哪有錯?
10/15 01:02, 13F

10/15 01:02, , 14F
只是一般function pointer宣告阿
10/15 01:02, 14F

10/15 01:03, , 15F
不加int a;的話 44行是不會呼叫到printBook的
10/15 01:03, 15F

10/15 01:03, , 16F
這真是惡搞的寫法..是要用C模擬出virtual function嗎= =
10/15 01:03, 16F

10/15 01:04, , 17F
int a;宣告的目的是讓SaleItem和Book的function pointer
10/15 01:04, 17F

10/15 01:04, , 18F
「對齊」這樣轉型後的function pointer offset才會「對齊
10/15 01:04, 18F

10/15 01:06, , 19F
喔原來是在問這個阿???
10/15 01:06, 19F

10/15 01:24, , 20F
問個怪問題 *(items[0]->print)(items[0]);這樣為啥不給過?
10/15 01:24, 20F

10/15 01:27, , 21F
原來是要讓他在記憶體位置對齊?
10/15 01:27, 21F

10/15 01:27, , 22F
難怪我把他改成double也可行
10/15 01:27, 22F

10/15 01:29, , 23F
改double不能吧?? 哪裡改double
10/15 01:29, 23F

10/15 01:29, , 24F
你說兩個都改嘛XD
10/15 01:29, 24F

10/15 01:31, , 25F
是的
10/15 01:31, 25F

10/15 01:32, , 26F
不過我很好奇我那行為啥不過....很詭異
10/15 01:32, 26F

10/15 01:33, , 27F
應該是要寫這樣吧 (*items[0]).print(items[0]);
10/15 01:33, 27F

10/15 01:34, , 28F
function pointer後面一定要直接接括號吧
10/15 01:34, 28F

10/15 01:35, , 29F
喔我不是這意思 function pointer呼叫可以不加*也可以加
10/15 01:35, 29F

10/15 01:36, , 30F
我刻意要加星星 呼叫~ 可是一般寫法可以 這不行 不了解@@
10/15 01:36, 30F

10/15 01:47, , 31F
(*(*items[0]).print)(items[0]); 一般寫法也是這樣吧?
10/15 01:47, 31F

10/15 01:49, , 32F
↑多了一個*..
10/15 01:49, 32F

10/15 01:49, , 33F
喔我一開始打錯 我想打*(items[0]->print)(items[0]);
10/15 01:49, 33F

10/15 01:50, , 34F
不過看到您推文 我知道錯了改成(*(items[0]->print)(items[0]
10/15 01:50, 34F

10/15 01:50, , 35F
疑...一樣 暈了 反正我少了一層() ...謝謝你
10/15 01:50, 35F

10/15 01:50, , 36F
沒多不好意思= = 該睡了orz
10/15 01:50, 36F
文章代碼(AID): #1ArV81En (C_and_CPP)