如何将指针返回到稍微修改过的函数版本?

时间:2016-05-20 12:06:06

标签: c pointers function-pointers

考虑以下最小例子:

#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;
 } 

这样funcCfuncA具有相同的签名,而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) );
    }
}

2 个答案:

答案 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>