Can I define an array of structures depending on input?

Anna Sidera sidera.anna@ucy.ac.cy
Mon Jan 31 14:33:00 GMT 2011


Ok, Thanks.

Anna

----- Original Message -----
From: Axel Freyn <axel-freyn@gmx.de>
Date: Saturday, January 29, 2011 2:56 pm
Subject: Re: Can I define an array of structures depending on input?

> Hi anna,
> 
> On Sat, Jan 29, 2011 at 01:26:46PM +0200, Anna Sidera wrote:
> > Hello,
> > 
> > I have a program that uses some input parameters. One of these 
> parameters, for example my_input_parameter, takes values 1, 2, 3 
> and 4. I want to define an array in which each element is a 
> structure. But I want the structure to depend on the value of 
> my_input_parameter. For example:
> > 
> > struct my_structure {
> >    <things that depend on the value of my_input_parameter>
> > };
> > struct my_structure *my_array = (struct my_structure 
> *)malloc(10000*sizeof(struct my_structure));
> > 
> > Can you tell me any way to do this? 
> Well, the problem is: the decision, what your structure looks like
> exactly, has to be taken at compile-time -- the compiler has to 
> know it.
> The input-parameter is only known at runtime -- and then it's to 
> late to
> change the structure. So if I understand correctly, your goal is
> impossible as far as I know in compiled languages like C, but 
> would only
> be possible in interpreted languages like python (there, you can 
> changedata-types during runtime).
> What you can however do:
> 
> 1) Fix the input-parameter already at compile-time, and compile four
> different programs (for my_input_parameter=1,2,3 and 4). Then you 
> couldwrite something like this:
> struct my_structure{
> #if my_input_parameter == 1
> ...
> #endif
> #if my_input_parameter == 2
> ...
> #endif
> #if my_input_parameter == 3
> ...
> #endif
> #if my_input_parameter == 4
> ...
> #endif
> };
> and compile the code with e.g. "gcc -Dmy_input_parameter=2"
> That will give you best runtime performance -- and inѕtead of passing
> the input parameter, you have to call the appropriate program.
> Of course, another possibility here would be to link these four cases
> into a single program -- and the call the appropriate routine 
> dependingon your input parameter.
> 
> 2) you can use C++ and virtual functions (however, this might be 
> bad for
> the runtime-performance, depending on how you call the code. 
> Calling a
> virtual function needs more time than "normal" functions (and in 
> generalthey can't be inlined) ). Defining an abstract base-class, 
> which only
> contains your interface:
> class my_structure{
>  public:
>    virtual double get_element() = 0;
> }
> then you can again create 4 independent classes for your 4 parameters:
> class my_structure_1{        	// for my_input_parameter == 1
>  public:
>    double get_element(){ ....}
> };
> class my_structure_2{        	// for my_input_parameter == 2
>  public:
>    double get_element(){ ....}
> };
> ...
> 3) you can do something analogous in C by using a structure with
> function pointers, which you define to behave differently for
> my_input_parameter == 1,2,3 or 4.
> 
> 
> Axel
> 
>



More information about the Gcc-help mailing list