Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Routine pointer to struct with struct as parameter

I have a chicken and the egg problem. I want to pass a data struct to a routine which contains a pointer to a routine who needs the struct.

I made a very simple example.

I need to use the CalcDataStruct before it's defined, if I add it after the struct, the FuntctionPrototype is not defined.

The problem i run against is only in the first 2 lines, the rest may contain a few syntax errors because I have not checked this inside the compiler.

typedef void(*FunctionPrototype)(CalcDataStruct *Ptr);

struct CalcDataStruct 
{
  int A, B, C, D;
  int Values;
  char SignA, Sign B;
  int Result;
  FunctionPrototype Routine;
}


struct ScanStruct
{
  char Sign; 
  int Values;
  FunctionPrototype Routine;
};


const ScanStruct ExampleList[] =
{
   { '+', 2, AddTwo },
   { '+', 3, AddThree }
};

void AddTwo(CalcDataStruct *Ptr)
{
  // use the data and if needed put it back
}

void AddThree(CalcDataStruct *Ptr)
{
  // use the data and if needed put it back
}

void GetFunction(CalcDataStuct *Ptr, ScanStruct *List)
{
   // Very simple return based on nothing
   Ptr->Routine = *List[(1)].Routine;
}   

void main()
{
   CalcDataStruct A;
   // struct is filled

   // Fill in the routine pointer based on data
  GetFunction(A, ExampleList)
  // Execute the routine fetched with all the data
  A->Routine(A)
}
like image 279
BWonder Avatar asked May 26 '26 08:05

BWonder


1 Answers

You need to add a forward declaration (see below).

struct CalcDataStruct; will just declare that struct CalcDataStruct exists, so the typedef void(*FunctionPrototype)(CalcDataStruct *Ptr); declaration will succeed because now the compiler knows that struct CalcDataStruct exists but without knowing the details of the struct, which doesn't matter because all the FunctionPrototype declaration needs is to know that the parameter is a pointer to struct CalcDataStruct.

struct CalcDataStruct; // <<< add this

typedef void(*FunctionPrototype)(CalcDataStruct *Ptr);

struct CalcDataStruct 
{
  int A, B, C, D;
  int Values;
  char SignA, Sign B;
  int Result;
  FunctionPrototype Routine;
}
like image 183
Jabberwocky Avatar answered May 28 '26 00:05

Jabberwocky



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!