考虑以下最小例子:
#include <stdio.h>
double square(double x);
double cube(double x);
int main(){
double (*pArray[2]) (double x) = {square, cube};
return 0;
}
double square(double x){
return (x*x);
}
double cube(double x){
return (x*x*x);
}
现在,让我们假设*我们想要一个伪代码会出现这样的函数(+
不是真正的补充,请注意):
functionPointer funcB(y, functionPointer funcA){
functionPointer funcC = y + &funcA;
return funcC;
}
这样funcC
与funcA
具有相同的签名,而funcC(x)
则会返回y + funcA(x)
。我们怎样才能做到这一点?我无法想出办法。
*对于像
这样的东西很有用for(double y = 0; y < 1; y += 0.1){
for(double x = 0; x <= y; x += 0.1){
printf("%f\n", funcB(y, pArray[0])(x) );
printf("%f\n", funcB(y, pArray[1])(x) );
}
}
答案 0 :(得分:3)
您所描述的内容称为闭包(闭包可以看作是捕获了一些数据的匿名函数)。不幸的是,你无法在C中直接创建闭包 1 。你可以得到的最接近的是C ++中的functor对象(和lambdas,它是一种用于创建仿函数的语法糖),但那些不是一般的转换为函数指针。
您还可以通过引入用于维护状态的其他参数来模拟闭包。但是必须明确管理该州。
1 理论上,你可以分配一些内存,在那里写一些机器代码,将内存标记为可执行文件,并创建指向该代码的函数指针。然而,这将是高度依赖平台和非常复杂的任务。
答案 1 :(得分:0)
对于给出的示例,您不需要额外的函数指针。你可以这样做:
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<form id="ajax-contact-form" method="post">
<p>Büro m² Anzahl</p>
<input type="text" name="leweb_value_1" id="leweb_value_1">
<input type="text" name="leweb_value_1_input" id="leweb_value_1_input">
<p>Sanitär m² Anzahl</p>
<input type="text" name="leweb_value_2" id="leweb_value_2">
<input type="text" name="leweb_value_2_input" id="leweb_value_2_input">
<p> Wie oft </p>
<select id="leweb_value_5" class="leweb_value_5" name="leweb_value_5" value="">
<option value="">Anzahl waehlen</option>
<option value="2.50">1x</option>
<option value="5.00">2x</option>
</select>
<input type="text" id="leweb_value_5_input" name="leweb_value_5_input" value=""/><br>
<p>Preis<span id="preis"></span></p>
<input name="type" value="senden" type="button" /><br />
<input id="total_price" name="" value="0" type="text" />
</form>
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#leweb_value_1').change(function() { // WENN SELECT CHANGED
$('#leweb_value_1_input').val(''); // TEXTFELD LEEREN
var selectValue = $(this).val() // VALUE AUS SELECT
$('#leweb_value_1_input').val(selectValue); // TEXTFELD FÜLLEN
leweb_price_new();
});
$('#leweb_value_2').change(function() { // WENN SELECT CHANGED
$('#leweb_value_2_input').val(''); // TEXTFELD LEEREN
var selectValue = $(this).val() // VALUE AUS SELECT
$('#leweb_value_2_input').val(selectValue); // TEXTFELD FÜLLEN
leweb_price_new();
});
$('#leweb_value_5').change(function() { // WENN SELECT CHANGED
$('#leweb_value_5_input').val(''); // TEXTFELD LEEREN
var selectValue = $(this).val() // VALUE AUS SELECT
$('#leweb_value_5_input').val(selectValue); // TEXTFELD FÜLLEN
leweb_price_new();
});
function leweb_price_new() {
//if ( $('input[name=type]').val() = 0 ) {
var a = parseInt($('#leweb_value_1_input').val());
var b = parseInt($('#leweb_value_2_input').val());
var c = parseInt($('#leweb_value_5_input').val());
var total = (a+b)*c;
if(!isNaN(total)){
$('#total_price').val(total);
}
}
//jQuery('form').delegate('input[name=type], #leweb_value_1_input, #leweb_value_2_input','change', leweb_price_new);
});
</script>
</body>
</html>