作者leondemon (狗狗)
看板C_and_CPP
標題[問題] 關於回傳值 與 block 的問題
時間Thu Sep 19 15:19:16 2013
想問幾個關於 C 語言的問題
問題一:如果一個 function 的回傳值的型別不確定 有辦法宣告嗎?
例如:有兩個 function 定義如下
/** 計算一個物件的分數 */
int calculateScore(void *obj){
return scoreForAnswers(obj->answer1, obj->answer2); //有很多answers只列兩個
};
/** 針對答案進行分數計算 */
int scoreForAnswers(int answer, ...){
int score;
// 把 answer 計算加總然後 assign 給 score
return score;
};
今天我想插入一個 function call 在兩個 functions 之間:
/** 這個 function 可以接受任何 type 的 value 並把該 value 繼續回傳*/
unknown_return_type sideEffect(unknown_return_type value){
printf("This is side effect function");
return value;
}
/** 計算一個物件的分數,但多呼叫一個 sideEffect() */
int calculateScore(void *obj){
return sideEffect(scoreForAnswers(obj->answer1, obj->answer2));
};
==> 因此執行 calculateScore() 時,會順便執行 sideEffect function
// -----
請問 有辦法讓一個 function 吃一個未知 type 的變數 並將它回傳嗎?
// -----
問題二:有辦法把一個變數傳入一個沒有回傳值的 function 後,還能改變該變數嗎?
(
解答):
int integer_not_greater_than_100(int *input){
if (*input > 100){
*input = 100;
return 1;
}
return 0;
}
void printIntValue(int value){
int hasChanged = integer_not_greater_than_100(&value);
printf("value: %d; hasChanged: %d", value, hasChanged);
}
int main (int argc, char * argv[] ) {
int value = 300;
printIntValue(value); // 會印出100
return 0;
};
==> 希望當 printIntValue() 輸入的值大於 100 時,只會列印 100
這兩個問題我一直想要去實踐,但是一直找不到方法
希望高手能幫忙
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.245.65.129
→ Feis:純C嗎? 09/19 15:28
推 Ebergies:1. template 2. int &value 09/19 15:29
→ Feis:1. 要改介面考慮 void * 2. 看不懂需求,為何要求 void ? 09/19 15:30
→ leondemon:使用 C (或Obj-C) ;E大的回答我不太懂 >"< 09/19 15:36
→ loveme00835:不用巢狀呼叫吧… 用個 callback 接受 void* 即可 09/19 15:37
→ Ebergies:C or Obj-C 請忽視我的發言... 09/19 15:38
→ loveme00835:第二個問題:印的責任應該在 printIntValue 裡,最前 09/19 15:41
→ loveme00835:面加上 if 判斷即可。不要寫一行程式 09/19 15:42
→ loveme00835:加在後面不用判斷,直接印出即可 09/19 15:44
→ leondemon:第二個問題解決了,謝謝大家 ^^ 不過第一個還在研究中 09/19 16:13
※ 編輯: leondemon 來自: 60.245.65.129 (09/19 16:26)
→ leondemon:不太懂 loveme 大大對於第一個問題的意思 Orz 09/19 16:30
推 EdisonX:問題一你可以找一下 stdlib.h 裡面 qsort 的實作。 09/19 19:34
→ EdisonX:loveme~ 講的應就是那方式 09/19 19:35
→ leondemon:謝謝提示 我會去找找看^^ 09/19 22:33