Re: Array of pointer-to-functions
On Sunday, September 16, 2012 10:11:33 PM UTC-5, (unknown) wrote:
On Sunday, September 16, 2012 6:25:52 PM UTC-5, I wrote:
Hello,
Question: How do I create a n array of pointer - to - functions to be f=
illed by a user?
My goal is to create the calculate function, which takes two values and=
passes them to a array of pointer-to-functions, which calculates something=
from those 2 values and returns it.
I am not getting any build errors. It is definitly not running though.=
I am guessing my problem is in one of 3 places:
1.) the calculate protoype
2.) the calculate function
3.) the defenition of double calculate(double y, double x, int z,double=
(*pt[])(double a,double b))
but I am running out of ideas (and still find pointers confusing). Any =
hints would be welcome and appreciated.
Thanks
I
Here is my code:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#include <limits>
using namespace std;
//int size;
//functions below here
double calculate(double y, double x, int z,double (*pt[])(double a,doub=
le b)); //changed 4 to [] in hopes of creating a blank array
double add(double a, double b);
double subtract(double a, double b);
double mult(double a, double b);
double divide(double a, double b);
double mean(double a, double b);
double pythag(double a, double b);
/*
* begin main
*/
int main()
{
int choice,size_choice;
double (*pt[size_choice])(double a, double b);//={add,subtract,mu=
lt,divide};
The problem is here. This is not valid (the size of an array must be a co=
nstant), although some compilers accept it. But even with those compilers t=
hat accept it, it won't do what you want because size_choice hasn't been in=
itialized. Most likely it will contain a random large value, and the progra=
m will try to allocate a large amount of memory on the stack, causing a sta=
ck overflow.
double a,b,test;
cout<<"Enter two values: \n";
if(!(cin>>a>>b))
cout<<"Catastrophic Error!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
//Now going to attempt to write a switch that allow users to choose=
up to 5 functions to operate on their numbers
cout<<"Choose the # of functions you wish to use (only six function=
s currently available) \n";
while(1)
{
if(!(cin>>size_choice))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Failure\n";
}
else
break;
}
Here is where you would declare the array, now that size_choice has been =
initialized:
double (*pt[size_choice])(double a, double b);// {add, subtract, mult, di=
vide};
Or use std::vector:
vector<double(*)(double, double)> pt(size_choice);
But I don't see why you need to allocate only size_choice pointers. Just =
declare an array that contains all the function pointers and use only the o=
nes you need.
cout<<"Choose your functions: \n"
"1.) add 2.) subtract 3.) mult\n"
"4.) divide 5.) mean 6.) pythag\n";
//cin>>choice;
for(int i=0;i<size_choice;i++)
{
cin>>choice;
switch(choice)
{
case 1: pt[i]=add;
break;
case 2: pt[i]=subtract;
break;
case 3: pt[i]=mult;
break;
case 4: pt[i]=divide;
break;
case 5: pt[i]=mean;
break;
case 6: pt[i]=pythag;
break;
}
}
calculate(a,b,size_choice,pt);
return 0;
}
/*
*Define your functions after break!
*/
double calculate(double y, double x,int z, double (*pt[])(double,double=
))
{
double * temp = new double [z];
//double a,b,test=0;
for(int i=0;i<z;i++)
{
temp[i]=(*pt[i])(x,y);
cout<<temp[i]<<" next \n";
}
delete [] temp;
}
double add(double a, double b)
{
return a+b;
}
double subtract(double a, double b)
{
double total=a-b;
return total;
}
double mult(double a, double b)
{
return a*b;
}
double divide(double a, double b)
{
double total=a/b;
//double remainder=a%b;
return total;
}
double mean(double a, double b)
{
return (a+b)/2;
}
double pythag(double a, double b)
{
return sqrt((a*a)+(b*b));
}
By the way, a better way to do this is with polymorphism:
class Operation
{
public:
virtual double Calculate(double a, double b) = 0;
};
class AddOperation : public Operation
{
public:
double Calculate(double a, double b) { return a + b; }
};
class SubtractOperation : public Operation
{
public:
double Calculate(double a, double b) { return a - b; }
};
...
Then create a vector of Operations:
vector<Operation*> operations(size_choice);
And add objects to it like you added function pointers to the other array=
:
switch (choice)
{
case 1:
operations[i] = new AddOperation();
break;
case 2:
operations[i] = new SubtractOperation();
break;
...
}
And then call Calculate on all the objects:
for (int i = 0; i < n; ++i)
cout << operations[i]->Calculate(a, b) << endl;
On Sunday, September 16, 2012 10:11:33 PM UTC-5, (unknown) wrote:
On Sunday, September 16, 2012 6:25:52 PM UTC-5, I wrote:
Hello,
Question: How do I create a n array of pointer - to - functions to be f=
illed by a user?
My goal is to create the calculate function, which takes two values and=
passes them to a array of pointer-to-functions, which calculates something=
from those 2 values and returns it.
I am not getting any build errors. It is definitly not running though.=
I am guessing my problem is in one of 3 places:
1.) the calculate protoype
2.) the calculate function
3.) the defenition of double calculate(double y, double x, int z,double=
(*pt[])(double a,double b))
but I am running out of ideas (and still find pointers confusing). Any =
hints would be welcome and appreciated.
Thanks
I
Here is my code:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#include <limits>
using namespace std;
//int size;
//functions below here
double calculate(double y, double x, int z,double (*pt[])(double a,doub=
le b)); //changed 4 to [] in hopes of creating a blank array
double add(double a, double b);
double subtract(double a, double b);
double mult(double a, double b);
double divide(double a, double b);
double mean(double a, double b);
double pythag(double a, double b);
/*
* begin main
*/
int main()
{
int choice,size_choice;
double (*pt[size_choice])(double a, double b);//={add,subtract,mu=
lt,divide};
The problem is here. This is not valid (the size of an array must be a co=
nstant), although some compilers accept it. But even with those compilers t=
hat accept it, it won't do what you want because size_choice hasn't been in=
itialized. Most likely it will contain a random large value, and the progra=
m will try to allocate a large amount of memory on the stack, causing a sta=
ck overflow.
double a,b,test;
cout<<"Enter two values: \n";
if(!(cin>>a>>b))
cout<<"Catastrophic Error!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
//Now going to attempt to write a switch that allow users to choose=
up to 5 functions to operate on their numbers
cout<<"Choose the # of functions you wish to use (only six function=
s currently available) \n";
while(1)
{
if(!(cin>>size_choice))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Failure\n";
}
else
break;
}
Here is where you would declare the array, now that size_choice has been =
initialized:
double (*pt[size_choice])(double a, double b);// {add, subtract, mult, di=
vide};
Or use std::vector:
vector<double(*)(double, double)> pt(size_choice);
But I don't see why you need to allocate only size_choice pointers. Just =
declare an array that contains all the function pointers and use only the o=
nes you need.
cout<<"Choose your functions: \n"
"1.) add 2.) subtract 3.) mult\n"
"4.) divide 5.) mean 6.) pythag\n";
//cin>>choice;
for(int i=0;i<size_choice;i++)
{
cin>>choice;
switch(choice)
{
case 1: pt[i]=add;
break;
case 2: pt[i]=subtract;
break;
case 3: pt[i]=mult;
break;
case 4: pt[i]=divide;
break;
case 5: pt[i]=mean;
break;
case 6: pt[i]=pythag;
break;
}
}
calculate(a,b,size_choice,pt);
return 0;
}
/*
*Define your functions after break!
*/
double calculate(double y, double x,int z, double (*pt[])(double,double=
))
{
double * temp = new double [z];
//double a,b,test=0;
for(int i=0;i<z;i++)
{
temp[i]=(*pt[i])(x,y);
cout<<temp[i]<<" next \n";
}
delete [] temp;
}
double add(double a, double b)
{
return a+b;
}
double subtract(double a, double b)
{
double total=a-b;
return total;
}
double mult(double a, double b)
{
return a*b;
}
double divide(double a, double b)
{
double total=a/b;
//double remainder=a%b;
return total;
}
double mean(double a, double b)
{
return (a+b)/2;
}
double pythag(double a, double b)
{
return sqrt((a*a)+(b*b));
}
By the way, a better way to do this is with polymorphism:
class Operation
{
public:
virtual double Calculate(double a, double b) = 0;
};
class AddOperation : public Operation
{
public:
double Calculate(double a, double b) { return a + b; }
};
class SubtractOperation : public Operation
{
public:
double Calculate(double a, double b) { return a - b; }
};
...
Then create a vector of Operations:
vector<Operation*> operations(size_choice);
And add objects to it like you added function pointers to the other array=
:
switch (choice)
{
case 1:
operations[i] = new AddOperation();
break;
case 2:
operations[i] = new SubtractOperation();
break;
...
}
And then call Calculate on all the objects:
for (int i = 0; i < n; ++i)
cout << operations[i]->Calculate(a, b) << endl;
Great, thanks for the tip! Just getting into classes, hopefully polymorphis=
ms will come up in the text.