cast to pointer to function

E

etienne

Hello,
I am looking for help for a cast problem:
I want to run functions in thread, using the pthread_create function.
The function to run is the first argument of pthread_create and is
expected to be of type void* (*func)(void*)
My problem is that I want to get the name of the function to run in
a .txt file that I parse at runtime.
I read the file and I get the name in a char* variable.
Now I want that this char* variable is the name of the function to
run. How do I do that?
I want to do something like:
char *func_to_run = scanf(the, good, args);
pthread_create (thread, attr, (magic cast)func_to_run, arg);

Even better, is it possible to test, at run time, that the provided
name is the name of a function that exists somewhere in the compiled
code?

Thanks for any help

Etienne
 
S

santosh

"]
Hello,
I am looking for help for a cast problem:
I want to run functions in thread, using the pthread_create
function. The function to run is the first argument of
pthread_create and is expected to be of type void* (*func)(void*)
My problem is that I want to get the name of the function to run in
a .txt file that I parse at runtime.
I read the file and I get the name in a char* variable.
Now I want that this char* variable is the name of the function to
run. How do I do that?
I want to do something like:
char *func_to_run = scanf(the, good, args);
pthread_create (thread, attr, (magic cast)func_to_run, arg);

Even better, is it possible to test, at run time, that the provided
name is the name of a function that exists somewhere in the
compiled code?

Thanks for any help[/QUOTE]

The group has discussed your problem many times before, AFAICT, the
consensus is that this cannot be done within Standard C code. Or
maybe it *can* be done, but then you might have to write an awful
lot of code to accomplish it.

Someone much more experienced than me will probably explain shortly.
 
J

Jens Thoms Toerring

etienne said:
I am looking for help for a cast problem:
I want to run functions in thread, using the pthread_create function.
The function to run is the first argument of pthread_create and is
expected to be of type void* (*func)(void*)
My problem is that I want to get the name of the function to run in
a .txt file that I parse at runtime.
I read the file and I get the name in a char* variable.
Now I want that this char* variable is the name of the function to
run. How do I do that?
I want to do something like:
char *func_to_run = scanf(the, good, args);
pthread_create (thread, attr, (magic cast)func_to_run, arg);

Unfortunately, there's no "magic cast" that can convert a
string into a pointer to a function of that name, simply
because information about function and variable names is
not stored in the program - functions and variables get
converted to addresses during compilation (or at least
linking).
Even better, is it possible to test, at run time, that the provided
name is the name of a function that exists somewhere in the compiled
code?

If you don't insist on a "magic cast" there's a trival solution.
Just create an array of structures of a type like this:

struct name2address {
const char *name;
void * ( * addr ) ( void * );
};

Make the array large enough to hold as many structures as you
have functions that you want to know by both name and address
and then initialize the array accordingly. Now, when you read
in your file you just have to search this array for the element
where the name field is identical to the name of the function
you read from the text file. This then gives you the address of
function which you then can use to call it. And a failure to
find the function in the array of structures immediately tells
you that what you did read from the text file was invalid.

Regards, Jens
 
S

SM Ryan

(e-mail address removed) (Jens Thoms Toerring) wrote:
# > I am looking for help for a cast problem:
# > I want to run functions in thread, using the pthread_create function.
# > The function to run is the first argument of pthread_create and is
# > expected to be of type void* (*func)(void*)
# > My problem is that I want to get the name of the function to run in
# > a .txt file that I parse at runtime.
# > I read the file and I get the name in a char* variable.
# > Now I want that this char* variable is the name of the function to
# > run. How do I do that?
# > I want to do something like:
# > char *func_to_run = scanf(the, good, args);
# > pthread_create (thread, attr, (magic cast)func_to_run, arg);
#
# Unfortunately, there's no "magic cast" that can convert a
# string into a pointer to a function of that name, simply
# because information about function and variable names is

There is no magic cast in ANSI C, but there may be system
specific ways to get this. For example, you may be able to
get a load map from the loader and postprocess this into
a function name map; but this would specific to your loader
and development system.
 
E

Eric Sosman

etienne said:
Hello,
I am looking for help for a cast problem:
I want to run functions in thread, using the pthread_create function.
The function to run is the first argument of pthread_create and is
expected to be of type void* (*func)(void*)
My problem is that I want to get the name of the function to run in
a .txt file that I parse at runtime.
I read the file and I get the name in a char* variable.
Now I want that this char* variable is the name of the function to
run. How do I do that?
I want to do something like:
char *func_to_run = scanf(the, good, args);
pthread_create (thread, attr, (magic cast)func_to_run, arg);

Even better, is it possible to test, at run time, that the provided
name is the name of a function that exists somewhere in the compiled
code?

This is Question 20.6 in the comp.lang.c Frequently
Asked Questions (FAQ) list, <http://c-faq.com/>.
 
R

regis

etienne said:
I want to do something like:
char *func_to_run = scanf(the, good, args);
pthread_create (thread, attr, (magic cast)func_to_run, arg);

Even better, is it possible to test, at run time, that the provided
name is the name of a function that exists somewhere in the compiled
code?

System specific solutions exist to call the dynamic linking loader:
You might want to look at the man page of functions
dlopen(), dlsym(), dlclose()...
 
E

etienne

System specific solutions exist to call the dynamic linking loader:
You might want to look at the man page of functions
dlopen(), dlsym(), dlclose()...


These functions do more or less what I want to do. I will try to use
them.
Thanks for your help.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top