Sponsored Content
Full Discussion: C function call dynamically
Top Forums Programming C function call dynamically Post 302379346 by DreamWarrior on Thursday 10th of December 2009 11:57:54 AM
Old 12-10-2009
I think the short answer is no. As far as I know, there is no way in C to dynamically control the call stack. You may need to build your own argument list into a structure that can be dynamically composed by the caller and decomposed by the callee. Then, to all your "dynamic" functions, you pass the structure as a single argument.

The only way to use var-args, IMO, would be to know ahead of time the set of argument lists that you can support. You would have to limit the number of items in the set to something manageable by a switch statement. So, for example, if you have 40 procedures and the unique set of argument lists is [ (string), (string, int), (int, int), (string, string, string) ] then you have four different argument lists in the set and you can use a single four item switch statement to make the call after selecting the right function pointer.

However, if you can't limit the number of different argument lists, and you need a generic caller, then things get hairy quickly. No matter what, you have to at least limit the number of types and argument counts you can support. But, the combinations of types and counts quickly increases the number of items in the set that must be supported by the switch statement.

In fact, in the case where you allow (string, int, long) in either 1, 2, or 3 arguments you can have 3+9+27 = 39 different possible argument lists in the set. Make it 1, 2, 3, or 4 arguments it goes up to 120. Make it four different types and four lengths and you will have such a large set you won't want to write the switch statement to manage it; it'll have 4+16+64+256 = 340 switch cases.

As you can see, to make a generic caller in the above cases would get cumbersome.

Quickly, back to the "generic thrower" comment. You must realize that when a function is compiled (in this case your generic thrower function) the compiler configures a stack frame that is large enough to store arguments for the functions called by the "generic thrower". While you could manipulate that stack frame (in an architecture specific way) during runtime to call a function with any arguments you want, the compiler is still in control of the size of the stack frame. Too many, or too large, arguments and you'll overrun the frame and corrupt memory. If you could force the compiler to create a larger than normal stack frame so you'll "never" overrun it then you may be able to read up on how your architecture composes its stack frames to place the arguments into the frame and make a call (with no arguments) to the function and hope what you tweaked into the stack frame sticks around for the function to pick up. But, this won't be pretty code, and it won't be guaranteed to be compatible across different systems.

On more note, I'm not sure all architectures store the arguments for the called function in the frame of the caller. However, I know AIX does. If yours does not, then you're in even bigger trouble because then you need to figure out how to allocate a stack frame yourself, put all the arguments in it, and fire off the call. All of this is, also, architecture specific. And to code it, you're probably looking at dipping into ASM.
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

function call

can I call a function in bash script just as in C++ while do function() done function() thanks, Steffen (3 Replies)
Discussion started by: forever_49ers
3 Replies

2. Programming

Help with a function call

Hi, Can anyone help me figure out the problem I'm having with a function call? I have a header file, which sets an enum: typedef enum {INFO, WARNING, FATAL} Levels; int log_event (Levels, char *fmt, ...); ..then the function is called this way: log_event(INFO, "Message text"); ... (6 Replies)
Discussion started by: Stevhp
6 Replies

3. Shell Programming and Scripting

call function

I have a function check_ok in my abc.sh. which return me 1 or 0 . I want to call this fuction through other shell script. this shell also send two parameter to calling function. Can you please tell me how. I am very new in unix. #!/bin/bash date_equal() { sqlplus -silent... (4 Replies)
Discussion started by: Jamil Qadir
4 Replies

4. Shell Programming and Scripting

help on function call

hello, when i call function inside awk traitement it doesn't work, i don't have error execution but i don't get result and if i call the function outside awk traitement it work well.. there's something special in awk call function?? here is the example : awk -F "," '{ {first=$1; sec=$2;... (3 Replies)
Discussion started by: kamel.seg
3 Replies

5. Shell Programming and Scripting

Function Call

How we can start a process if doesn't exists before? (1 Reply)
Discussion started by: Zaxon
1 Replies

6. Infrastructure Monitoring

diffrence between method call and function call in perl

Hello, I have a problem with package and name space. require "/Mehran/DSGateEngineLib/general.pl"; use strict; sub System_Status_Main_Service_Status_Intrusion_Prevention { my %idpstatus; my @result; &General_ReadHash("/var/dsg/idp/settings",\%idpstatus); #print... (4 Replies)
Discussion started by: Zaxon
4 Replies

7. Shell Programming and Scripting

Function call

Hi foiks i am unable to find what is wrong in my code mu functionality is to exit from shell when i give 99 but it is not calling function ext Could you please correct me. read option if ; then ext else echo "out" fi function ext { echo "tested 99 and exit... (12 Replies)
Discussion started by: kojo
12 Replies

8. Shell Programming and Scripting

After exit from function it should not call other function

Below is my script that is function properly per my conditions but I am facing one problem here that is when one function fails then Iy should not check other functions but it calls the other function too So anyone can help me how could i achieve this? iNOUT i AM GIVING TO THE... (1 Reply)
Discussion started by: rohit22hamirpur
1 Replies

9. Shell Programming and Scripting

How to dynamically name as function in shell?

Hi all, Does anyone know if it possible to append a parameter to a function name? Something like the following: function tnsrec_${SERVICE_NAME} { code.. } Any ideas? (6 Replies)
Discussion started by: jonnyd
6 Replies

10. Homework & Coursework Questions

How to Dynamically Pass Parameter to plsql Function & Capture its Output Value in a Shell Variable?

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: 2. Relevant commands, code, scripts, algorithms: #! /bin/ksh v="ORG_ID" ... (2 Replies)
Discussion started by: sujitdas2104
2 Replies
Devel::StackTrace(3pm)					User Contributed Perl Documentation				    Devel::StackTrace(3pm)

NAME
Devel::StackTrace - An object representing a stack trace VERSION
version 1.27 SYNOPSIS
use Devel::StackTrace; my $trace = Devel::StackTrace->new; print $trace->as_string; # like carp # from top (most recent) of stack to bottom. while (my $frame = $trace->next_frame) { print "Has args " if $frame->hasargs; } # from bottom (least recent) of stack to top. while (my $frame = $trace->prev_frame) { print "Sub: ", $frame->subroutine, " "; } DESCRIPTION
The Devel::StackTrace module contains two classes, Devel::StackTrace and Devel::StackTrace::Frame. The goal of this object is to encapsulate the information that can found through using the caller() function, as well as providing a simple interface to this data. The Devel::StackTrace object contains a set of Devel::StackTrace::Frame objects, one for each level of the stack. The frames contain all the data available from "caller()". This code was created to support my Exception::Class::Base class (part of Exception::Class) but may be useful in other contexts. 'TOP' AND 'BOTTOM' OF THE STACK When describing the methods of the trace object, I use the words 'top' and 'bottom'. In this context, the 'top' frame on the stack is the most recent frame and the 'bottom' is the least recent. Here's an example: foo(); # bottom frame is here sub foo { bar(); } sub bar { Devel::StackTrace->new; # top frame is here. } Devel::StackTrace METHODS o Devel::StackTrace->new(%named_params) Returns a new Devel::StackTrace object. Takes the following parameters: o frame_filter => $sub By default, Devel::StackTrace will include all stack frames before the call to its its constructor. However, you may want to filter out some frames with more granularity than 'ignore_package' or 'ignore_class' allow. You can provide a subroutine which is called with the raw frame data for each frame. This is a hash reference with two keys, "caller", and "args", both of which are array references. The "caller" key is the raw data as returned by Perl's "caller()" function, and the "args" key are the subroutine arguments found in @DB::args. The filter should return true if the frame should be included, or false if it should be skipped. o ignore_package => $package_name OR @package_names Any frames where the package is one of these packages will not be on the stack. o ignore_class => $package_name OR @package_names Any frames where the package is a subclass of one of these packages (or is the same package) will not be on the stack. Devel::StackTrace internally adds itself to the 'ignore_package' parameter, meaning that the Devel::StackTrace package is ALWAYS ignored. However, if you create a subclass of Devel::StackTrace it will not be ignored. o no_refs => $boolean If this parameter is true, then Devel::StackTrace will not store references internally when generating stacktrace frames. This lets your objects go out of scope. Devel::StackTrace replaces any references with their stringified representation. o respect_overload => $boolean By default, Devel::StackTrace will call "overload::AddrRef()" to get the underlying string representation of an object, instead of respecting the object's stringification overloading. If you would prefer to see the overloaded representation of objects in stack traces, then set this parameter to true. o max_arg_length => $integer By default, Devel::StackTrace will display the entire argument for each subroutine call. Setting this parameter causes it to truncate the argument's string representation if it is longer than this number of characters. o message => $string By default, Devel::StackTrace will use 'Trace begun' as the message for the first stack frame when you call "as_string". You can supply an alternative message using this option. o indent => $boolean If this parameter is true, each stack frame after the first will start with a tab character, just like "Carp::confess()". o $trace->next_frame Returns the next Devel::StackTrace::Frame object down on the stack. If it hasn't been called before it returns the first frame. It returns undef when it reaches the bottom of the stack and then resets its pointer so the next call to "next_frame" or "prev_frame" will work properly. o $trace->prev_frame Returns the next Devel::StackTrace::Frame object up on the stack. If it hasn't been called before it returns the last frame. It returns undef when it reaches the top of the stack and then resets its pointer so pointer so the next call to "next_frame" or "prev_frame" will work properly. o $trace->reset_pointer Resets the pointer so that the next call "next_frame" or "prev_frame" will start at the top or bottom of the stack, as appropriate. o $trace->frames Returns a list of Devel::StackTrace::Frame objects. The order they are returned is from top (most recent) to bottom. o $trace->frame ($index) Given an index, returns the relevant frame or undef if there is not frame at that index. The index is exactly like a Perl array. The first frame is 0 and negative indexes are allowed. o $trace->frame_count Returns the number of frames in the trace object. o $trace->as_string Calls as_string on each frame from top to bottom, producing output quite similar to the Carp module's cluck/confess methods. SUPPORT
Please submit bugs to the CPAN RT system at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Devel%3A%3AStackTrace or via email at bug-devel-stacktrace@rt.cpan.org. AUTHOR
Dave Rolsky <autarch@urth.org> COPYRIGHT AND LICENSE
This software is Copyright (c) 2011 by Dave Rolsky. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible) perl v5.10.1 2011-01-16 Devel::StackTrace(3pm)
All times are GMT -4. The time now is 06:02 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy