473,837 Members | 1,561 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

An array of function pointers - generated parametrically

a
Hello.

Suppose I have a family of functions

f_0(x) = 0*x
f_1(x) = 1*x
....
f_n(x) = n*x

taking float and returning float (naturally, the actual functions would
be much more complex).
I'd like to pass the pointers to these functions one by one (in a loop)
to another function accepting an argument of type float (*)(float).

The problem is that the amount of these functions (or the n parameter)
will be determined at the runtime.

Is there a way to generate somehow such a family in the form of an array
float (*[])(float) ?

Or, having a function

float func(int i, float x) { return i*x; }

is it possible to "cast" it somehow to obtain an array indexed by i such
that (symbolically)

a[i](x) = func(i, x)

for all n and x ?

Thanks.
Jun 27 '08 #1
8 1741
In article <sl************ *@www.odyniec.p l>, <a@aaa.aaa.aaaw rote:
>Suppose I have a family of functions
>The problem is that the amount of these functions (or the n parameter)
will be determined at the runtime.
There is no way to generate functions at run-time in C. There is
also no way to create an "instance" of a function that has some
stored value that is different than a different "instance" of the
same function. Or to phrase it in terms that some other languages
use, there are no "closures" in standard C.
--
"Whenever there is a hard job to be done I assign it to a lazy
man; he is sure to find an easy way of doing it."
-- Walter Chrysler
Jun 27 '08 #2

<a@aaa.aaa.aaaw rote in message news:sl******** *****@www.odyni ec.pl...
Hello.

Suppose I have a family of functions

f_0(x) = 0*x
f_1(x) = 1*x
...
f_n(x) = n*x

taking float and returning float (naturally, the actual functions would
be much more complex).
I'd like to pass the pointers to these functions one by one (in a loop)
to another function accepting an argument of type float (*)(float).

The problem is that the amount of these functions (or the n parameter)
will be determined at the runtime.

Is there a way to generate somehow such a family in the form of an array
float (*[])(float) ?

Or, having a function

float func(int i, float x) { return i*x; }

is it possible to "cast" it somehow to obtain an array indexed by i such
that (symbolically)

a[i](x) = func(i, x)

for all n and x ?
Do you mean something like this?

#include <stdio.h>

float f0(float x){ return x*0;}
float f1(float x){ return x*1;}
float f2(float x){ return x*2;}

float (*fntable[3])(float) = {&f0, &f1, &f2};

int main(void)
{int i;
float x,y;

for (i=0; i<3; ++i)
{ x = i*10.0;
y = fntable[i](x);

printf("%d : f%d(%f) = %f\n",i,i,x,y);
}

}

--
Bart
Jun 27 '08 #3
Hello again and sorry for the different nicknames. I'm still
struggling with my reader.

On 2008-04-13, Walter Roberson <ro******@ibd.n rc-cnrc.gc.cawrote :
>
There is no way to generate functions at run-time in C. There is
also no way to create an "instance" of a function that has some
stored value that is different than a different "instance" of the
same function. Or to phrase it in terms that some other languages
use, there are no "closures" in standard C.
That's a pity, but really: not a tragedy. There was an easy workaround
in this case.

On 2008-04-13, Bartc <bc@freeuk.comw rote:
>
Do you mean something like this?

#include <stdio.h>

float f0(float x){ return x*0;}
float f1(float x){ return x*1;}
float f2(float x){ return x*2;}

float (*fntable[3])(float) = {&f0, &f1, &f2};

int main(void)
{int i;
float x,y;

for (i=0; i<3; ++i)
{ x = i*10.0;
y = fntable[i](x);

printf("%d : f%d(%f) = %f\n",i,i,x,y);
}

}
No, what I meant was:

1. The value of n is determined at the runtime.
2. Space for an array of function pointers is allocated.
3. Now some magic is done and these pointers point to f_0, ... f_n.

The point is, as I suppose, there is no way to dynamically allocate space
for a function because its code size is unpredictable.

Thanks for the replies.

Jun 27 '08 #4
On Sun, 13 Apr 2008 15:25:20 +0000 (UTC), a@aaa.aaa.aaa wrote:
>Hello.

Suppose I have a family of functions

f_0(x) = 0*x
f_1(x) = 1*x
...
f_n(x) = n*x

taking float and returning float (naturally, the actual functions would
be much more complex).
I'd like to pass the pointers to these functions one by one (in a loop)
to another function accepting an argument of type float (*)(float).

The problem is that the amount of these functions (or the n parameter)
will be determined at the runtime.

Is there a way to generate somehow such a family in the form of an array
float (*[])(float) ?
To simplify the discussion, let's define a typedef alias for the
pointer in question.
typedef float (*func_ptr)(flo at);

If you have a C99 system, you can define a variable length array whose
size n is dynamically determined at run time.
func_ptr func_array[n];

If you don't have C99 (or even if you do), you can allocate space for
such an array.
func_ptr *func_array;
func_array = malloc(n * sizeof *func_array);

In both cases, you need to assign values to the array elements.
func_array[0] = f0;
func_array[1] = f1; ...

Obviously, the functions must be declared previously and must be
defined prior to linking.
Remove del for email
Jun 27 '08 #5
John Doe <jo**@doe.comwr ites:
On 2008-04-13, Walter Roberson <ro******@ibd.n rc-cnrc.gc.cawrote :
>>
There is no way to generate functions at run-time in C. There is
also no way to create an "instance" of a function that has some
stored value that is different than a different "instance" of the
same function. Or to phrase it in terms that some other languages
use, there are no "closures" in standard C.

That's a pity, but really: not a tragedy. There was an easy workaround
in this case.

On 2008-04-13, Bartc <bc@freeuk.comw rote:
>>
Do you mean something like this?

#include <stdio.h>

float f0(float x){ return x*0;}
float f1(float x){ return x*1;}
float f2(float x){ return x*2;}

float (*fntable[3])(float) = {&f0, &f1, &f2};
<snip>
No, what I meant was:

1. The value of n is determined at the runtime.
2. Space for an array of function pointers is allocated.
The above can be altered so that the array is allocated with a run
time size. However...
3. Now some magic is done and these pointers point to f_0, ... f_n.
Walter Robertson's comment is important. Since functions can't be
"made" at run time, there is no point altering the above to make the
size a run-time expression because there can only be a fixed number of
functions in your program. Every function must be there, written out,
for the compiler to compile.

The pattern you want is *very* common in many programming languages,
but C can't do it. If you really want to do this, you need to look at
another language.

There are two get-out clauses: (1) you can use dynamic linking to
"pull in" functions at run time, but this is not portable and the
functions are still not run-time values. (2) If the functions share a
lot in common (for example if they are all polynomials in some fixed
set of variables) then you can write one single simulator function and
pass it data (in this case, the coefficients). In effect, you swap a
set of function pointers for one function and a set of data pointers.
The point is, as I suppose, there is no way to dynamically allocate space
for a function because its code size is unpredictable.
You are probably saying the same thing as I am in another way. I hope
my way of putting it helps a bit.

--
Ben.
Jun 27 '08 #6
On Apr 13, 7:10*pm, Ben Bacarisse <ben.use...@bsb .me.ukwrote:
John Doe <j...@doe.comwr ites:
On 2008-04-13, Walter Roberson <rober...@ibd.n rc-cnrc.gc.cawrote :
There is no way to generate functions at run-time in C. There is
also no way to create an "instance" of a function that has some
stored value that is different than a different "instance" of the
same function. Or to phrase it in terms that some other languages
use, there are no "closures" in standard C.
That's a pity, but really: not a tragedy. There was an easy workaround
in this case.
On 2008-04-13, Bartc <b...@freeuk.co mwrote:
Do you mean something like this?
#include <stdio.h>
float f0(float x){ return x*0;}
float f1(float x){ return x*1;}
float f2(float x){ return x*2;}
float (*fntable[3])(float) = {&f0, &f1, &f2};
<snip>
No, what I meant was:
1. The value of n is determined at the runtime.
2. Space for an array of function pointers is allocated.

The above can be altered so that the array is allocated with a run
time size. *However...
3. Now some magic is done and these pointers point to f_0, ... f_n.

Walter Robertson's comment is important. *Since functions can't be
"made" at run time, there is no point altering the above to make the
size a run-time expression because there can only be a fixed number of
functions in your program. *Every function must be there, written out,
for the compiler to compile.

The pattern you want is *very* common in many programming languages,
but C can't do it. *If you really want to do this, you need to look at
another language.

There are two get-out clauses: (1) you can use dynamic linking to
"pull in" functions at run time, but this is not portable and the
functions are still not run-time values. *(2) If the functions share a
lot in common (for example if they are all polynomials in some fixed
set of variables) then you can write one single simulator function and
pass it data (in this case, the coefficients). *In effect, you swap a
set of function pointers for one function and a set of data pointers.
The point is, as I suppose, there is no way to dynamically allocate space
for a function because its code size is unpredictable.

You are probably saying the same thing as I am in another way. *I hope
my way of putting it helps a bit.

--
Ben.- Hide quoted text -

- Show quoted text -
Hi List, Hello John

I really can't se why your same function can't accept values on
runtime. But you can always use some embedded language like lua
(www.lua.org) to handle this, loading new scripts on demand (building
new scripts from your application maybe...).
Regards
Rafael
Jun 27 '08 #7

"John Doe" <jo**@doe.comwr ote in message news:ft******** **@news.onet.pl ...
Hello again and sorry for the different nicknames. I'm still
struggling with my reader.

On 2008-04-13, Walter Roberson <ro******@ibd.n rc-cnrc.gc.cawrote :
>>
There is no way to generate functions at run-time in C. There is
also no way to create an "instance" of a function that has some
stored value that is different than a different "instance" of the
same function. Or to phrase it in terms that some other languages
use, there are no "closures" in standard C.

That's a pity, but really: not a tragedy. There was an easy workaround
in this case.

On 2008-04-13, Bartc <bc@freeuk.comw rote:
>>
Do you mean something like this?

#include <stdio.h>

float f0(float x){ return x*0;}
float f1(float x){ return x*1;}
float f2(float x){ return x*2;}

float (*fntable[3])(float) = {&f0, &f1, &f2};

int main(void)
{int i;
float x,y;

for (i=0; i<3; ++i)
{ x = i*10.0;
y = fntable[i](x);

printf("%d : f%d(%f) = %f\n",i,i,x,y);
}

}

No, what I meant was:

1. The value of n is determined at the runtime.
2. Space for an array of function pointers is allocated.
3. Now some magic is done and these pointers point to f_0, ... f_n.

The point is, as I suppose, there is no way to dynamically allocate space
for a function because its code size is unpredictable.
It's still not clear whether the code for these functions already exists
somewhere at compile-time.

Functions created at runtime aren't easy in C as has been pointed out.

But, although the code won't be as simple as you've indicated, could there
be any way of programmaticall y calculating what function n does? So for your
example, f_n(x) is simply x*n; you don't need an array of functions for
that.

So is there any similarity between functions that can be exploited? If you
give a few examples then we can see what's possible.

--
Bart

Jun 27 '08 #8
a@aaa.aaa.aaa wrote:
...
is it possible to "cast" it somehow to obtain an array indexed by i such
that (symbolically)

a[i](x) = func(i, x)

for all n and x ?
...
No, you can't do it in C literally the way you describe it.

When it is necessary to implement something like that in C, you'd normally stick
with one generic function (or fixed number of generic functions with unified
interface), parametrized to the point when it's capable of covering all required
behaviors of the family. Then you'd store the parameter sets in your array, and
later retrieve and pass the correct set of parameters when calling the generic
function. This will be essentially a "manual" implementation of C++ classes
(with or without virtual functions) with your original functions getting
generalized into "functors".

It is not as elegant as the "closure" functionality you describe in your
message, of course. And if the calling code strictly requires function pointers
without letting you pass some user context for the call, then you are out of luck.

--
Best regards,
Andrey Tarasevich
Jun 27 '08 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

58
10202
by: jr | last post by:
Sorry for this very dumb question, but I've clearly got a long way to go! Can someone please help me pass an array into a function. Here's a starting point. void TheMainFunc() { // Body of code... TCHAR myArray; DoStuff(myArray);
4
8833
by: Simon Schaap | last post by:
Hello, I have encountered a strange problem and I hope you can help me to understand it. What I want to do is to pass an array of chars to a function that will split it up (on every location where a * occurs in the string). This split function should allocate a 2D array of chars and put the split results in different rows. The listing below shows how I started to work on this. To keep the program simple and help focus the program the...
8
3692
by: Peter B. Steiger | last post by:
The latest project in my ongoing quest to evolve my brain from Pascal to C is a simple word game that involves stringing together random lists of words. In the Pascal version the whole array was static; if the input file contained more than entries, tough. This time I want to do it right - use a dynamic array that increases in size with each word read from the file. A few test programs that make use of **List and realloc( List, blah...
204
13153
by: Alexei A. Frounze | last post by:
Hi all, I have a question regarding the gcc behavior (gcc version 3.3.4). On the following test program it emits a warning: #include <stdio.h> int aInt2 = {0,1,2,4,9,16}; int aInt3 = {0,1,2,4,9};
6
2965
by: ebc | last post by:
Hi, I have written a function that removes double entries from a sorted array. See the structures typedef struct tagRECR { char name;
8
10723
by: intrepid_dw | last post by:
Hello, all. I've created a C# dll that contains, among other things, two functions dealing with byte arrays. The first is a function that returns a byte array, and the other is intended to receive a byte array as one of its parameters. The project is marked for COM interop, and that all proceeds normally. When I reference the type library in the VB6 project, and write the code to call the function that returns the byte array, it works
14
20418
by: Abhi | last post by:
I wrote a function foo(int arr) and its prototype is declared as foo(int arr); I modify the values of the array in the function and the values are getting modified in the main array which is passed also. I understand that this way of passing the array is by value and if the prototype is declared as foo(int *), it is by reference in which case the value if modified in the function will get reflected in the main function as well. I dont...
2
2990
by: StevenChiasson | last post by:
For the record, not a student, just someone attempting to learn C++. Anyway, the problem I'm having right now is the member function detAddress, of object controller. This is more or less, your standard dynamic address book program. Adding, and listing work just fine. However, deleting, editing and viewing relies on member function retAddress. This function returns an array of pointers that are pointing to created objects. In action, all it...
33
7199
by: Adam Chapman | last post by:
Hi, Im trying to migrate from programming in Matlab over to C. Im trying to make a simple function to multiply one matrix by the other. I've realised that C can't determine the size of a 2d array, so im inputting the dimensions of those myself. The problem is that the output array (C=A*B) has as many rows as A and as many columns as B. I would think of initialising C with:
0
9695
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10902
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10583
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
10286
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9420
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
7013
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5680
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5863
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
3
3128
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.