473,465 Members | 1,976 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

A good use of fn ptrs?

Is this a good use of fn ptrs?

#include <iostream>
#include <cstdlib>
using namespace std;

typedef void (*v_v_fptr)();

void Error(){cout << "Error" << endl;}

void Success(){cout << "Success" << endl;}

v_v_fptr select(bool arg){if(arg==true)return Success; else return
Error;}

int main()
{
bool val;
cout << "1|0?: " << endl;
cin >> val;
v_v_fptr ptr=select(val);
ptr();
system("PAUSE");
return 0;
}

Or should I use fn objs instead? Thanks!!!

Dec 17 '05 #1
14 1448
Protoman wrote:
Is this a good use of fn ptrs?
....
Or should I use fn objs instead? Thanks!!!


fn objs are more extensible and you loose nothing.
Dec 17 '05 #2
How would I make it use fn objs? Like this:

class select
{
public:
v_v_fptr operator()(bool val){if(val==true)return Success;else return
Error;}
};
//...
v_v_fptr ptr=select()(val);
ptr();

Could you help? Thanks!!!

Dec 17 '05 #3
I am programming for more that 10 years in C++ but I have not seen such
a way of error checking. But syntatically it is correct. If I were you I
would use exceptions.
Protoman wrote:
Is this a good use of fn ptrs?

#include <iostream>
#include <cstdlib>
using namespace std;

typedef void (*v_v_fptr)();

void Error(){cout << "Error" << endl;}

void Success(){cout << "Success" << endl;}

v_v_fptr select(bool arg){if(arg==true)return Success; else return
Error;}

int main()
{
bool val;
cout << "1|0?: " << endl;
cin >> val;
v_v_fptr ptr=select(val);
ptr();
system("PAUSE");
return 0;
}

Or should I use fn objs instead? Thanks!!!

Dec 17 '05 #4
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.

Dec 17 '05 #5
Protoman wrote:
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.

exceptions divide execution code from error checking code, that's the
reason why they were created....
Dec 17 '05 #6
Viktor Prehnal wrote:
Protoman wrote:
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.

exceptions divide execution code from error checking code, that's the
reason why they were created....


Is attempting to open a file that is not there an exception or an error?
Dec 17 '05 #7
Gianni Mariani wrote:
Viktor Prehnal wrote:
Protoman wrote:
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.

exceptions divide execution code from error checking code, that's the
reason why they were created....


Is attempting to open a file that is not there an exception or an error?


If the file was expected to exist, or if the file was necessary for the
program to operate, then almost certainly an exception.

If the filename was entered by the user, then probably an error,
although that error could easily be propagated up the stack by an
exception...

As is often the case, it depends!

Ben Pope
--
I'm not just a number. To many, I'm known as a string...
Dec 18 '05 #8
Ben Pope wrote:
Gianni Mariani wrote:

....
Is attempting to open a file that is not there an exception or an error?

If the file was expected to exist, or if the file was necessary for the
program to operate, then almost certainly an exception.

If the filename was entered by the user, then probably an error,
although that error could easily be propagated up the stack by an
exception...

As is often the case, it depends!


So now, exceptions are glorified cross function gotos. Probably not a
good thing.

I was on the fence for quite a while on exceptions and I'm now leaning
on a very minimal usage of exceptions. Opening a file is in almost
every case I have come across, not a case for using exceptions, even if
you expect the file to exist.

It's also very unfortunate that exception specifiers are dynamically
handled rather than allowing the compiler to do a static analysis.

Multithreaded code is almost always impossible to manage using exceptions.

I'm not trying to say exceptions are bad, I'm saying they're very
limited in utility. Also, I find it a fallacy that code is easier to
write. Handling exceptions correctly can get quite involved making the
code much more difficult to write if you have to write try/catch blocks
everywhere.

Anyhow, I'm sure that there are plenty o people who would debate this,
and I'm looking forward to a constructive one.
Dec 18 '05 #9
Gianni Mariani wrote:
Ben Pope wrote:
Gianni Mariani wrote: ...
Is attempting to open a file that is not there an exception or an error?

If the file was expected to exist, or if the file was necessary for the
program to operate, then almost certainly an exception.

If the filename was entered by the user, then probably an error,
although that error could easily be propagated up the stack by an
exception...

As is often the case, it depends!


So now, exceptions are glorified cross function gotos. Probably not a
good thing.


Well, that is what throw and catch do: transfer control to the handler
unwinding the stack as much as necessary to get to the handlers context. I
can see two main differences to goto: (a) goto is a little less restricted
in where it can take you, but (b) the target of the jump is always known,
whereas a throw can take you to a place that you do not know in advance.

I was on the fence for quite a while on exceptions and I'm now leaning
on a very minimal usage of exceptions. Opening a file is in almost
every case I have come across, not a case for using exceptions, even if
you expect the file to exist.
I tend to advocate throwing whenever the construction of an object fails.
The reason is that I usually do not see a good way of dealing with
half-constructed objects. So, failure to claim a resource is, in my book,
always a good candidate for a throw().

It's also very unfortunate that exception specifiers are dynamically
handled rather than allowing the compiler to do a static analysis.

Multithreaded code is almost always impossible to manage using exceptions.
Could you elaborate on this one. I have no experience in multithreaded
programming, so I do not really understand what you are refering to.

I'm not trying to say exceptions are bad, I'm saying they're very
limited in utility. Also, I find it a fallacy that code is easier to
write. Handling exceptions correctly can get quite involved making the
code much more difficult to write if you have to write try/catch blocks
everywhere.


The unfortunate thing is that you have to beware of exceptions whether you
use them or not: code beyond your control may throw just as well. In the
context of another thread it recently dawned upon me that very innocent
looking code can actually leak resources when exceptions enter the picture:

template < typename T >
class X {

T* data;

public:

X ( T const & t )
: data ( new T )
{
*data = t; // this leaks the pointer if the assignment throws.
}

}; // X

Better:

template < typename T >
class X {

T* data;

public:

X ( T const & t )
: data ( new T( t ) )
{}

}; // X

The upshot is: you really have to go through your code thinking "this line
might throw, what happens" at every single line you encounter. I find that
very hard, indeed.
Best regards

Kai-Uwe Bux
Dec 18 '05 #10
"Protoman" <Pr**********@gmail.com> wrote in message
news:11**********************@g14g2000cwa.googlegr oups.com...
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.


Well, if you're alread evaluating a variable to determine which function to
call... why not just call the function there instead?

Instead of:
v_v_fptr ptr=select(val);
ptr();

Just have:
select(val);

and have your select function do:

void select(bool arg)
{
if(arg==true)
cout << "Success" << endl;
else
cout << "Error" << endl;
}

Or, if you want to keep your success and error functions call them instead.

void select(bool arg)
{
if(arg==true)
Success();
else
Failure();
}

I don't see that you are gaining anything by returning a function to call,
then just calling the function. You are just adding an (error prone) level
of complexity for no good reason.

Just because you *can* do something doesn't mean you *should*.
Dec 18 '05 #11

Jim Langston wrote:
"Protoman" <Pr**********@gmail.com> wrote in message
news:11**********************@g14g2000cwa.googlegr oups.com...
Why use exceptions? This is just an examp; in a real prog, I'd use it
to determine what fn to call based on the val of a var.


Well, if you're alread evaluating a variable to determine which function to
call... why not just call the function there instead?

Instead of:
v_v_fptr ptr=select(val);
ptr();

Just have:
select(val);

and have your select function do:

void select(bool arg)
{
if(arg==true)
cout << "Success" << endl;
else
cout << "Error" << endl;
}

Or, if you want to keep your success and error functions call them instead.

void select(bool arg)
{
if(arg==true)
Success();
else
Failure();
}

I don't see that you are gaining anything by returning a function to call,
then just calling the function. You are just adding an (error prone) level
of complexity for no good reason.

Just because you *can* do something doesn't mean you *should*.


I was just doing it to learn about returning fn ptrs from fns; in a
real prog I would definitely not do this unless I had a *very good*
reason.

Dec 18 '05 #12
Gianni Mariani wrote:
Ben Pope wrote:
Gianni Mariani wrote: ...
Is attempting to open a file that is not there an exception or an error?

If the file was expected to exist, or if the file was necessary for
the program to operate, then almost certainly an exception.

If the filename was entered by the user, then probably an error,
although that error could easily be propagated up the stack by an
exception...

As is often the case, it depends!


So now, exceptions are glorified cross function gotos. Probably not a
good thing.


Quite different to a goto.

When a failure occurs, it is often the case that you do not know how to
handle the error, and so you inform your caller. If you do it via error
codes, then the caller has to check the return value, and decide what to
do, possibly informing its caller via a return code.

This results in lots of checks of calls into function for errors that
rarely occur, and manually propagating the error up the call stack.

With exceptions, you can short-cut the call up the stack. This means
you deal with the error when you know how to do so.
I was on the fence for quite a while on exceptions and I'm now leaning
on a very minimal usage of exceptions. Opening a file is in almost
every case I have come across, not a case for using exceptions, even if
you expect the file to exist.
Often, yes. If for example the filename was provided on the command
line, to the program, and you do a bunch of stuff, then try to open the
file and it doesn't exist, rather than manually propagate the error up
the call stack with return codes you can just throw, and then catch it
near the top, and inform the user they can't spell.
It's also very unfortunate that exception specifiers are dynamically
handled rather than allowing the compiler to do a static analysis.
Yes, I would have preferred to have to explicitly specify anything that
a function could throw, and for the compiler to provide static analysis:

#include <iostream>

void fun1() {
throw "foo";
}
void fun2() throw() {
throw "bar";
}
void fun3() throw() {
fun1();
}

int main() {
try {
fun1();
} catch (char* e) {
std::cout << "This is expected to fail: " << e << std::endl;
}
try {
fun3();
} catch (char* e) {
std::cout << "This is NOT expected to fail: " << e << std::endl;
}

}

It's a shame that more analysis is not done to ensure that fun3 does not
throw. VC8 warns that fun2 throws, but does not warn that fun3 calls a
function that throws.
Multithreaded code is almost always impossible to manage using exceptions.
Surely you have to manage throwing, anyway?
I'm not trying to say exceptions are bad, I'm saying they're very
limited in utility. Also, I find it a fallacy that code is easier to
write. Handling exceptions correctly can get quite involved making the
code much more difficult to write if you have to write try/catch blocks
everywhere.
Exceptions are for exceptional situations, things which are really bad,
things you don't really know how to deal with. If you write code to
deal with it, it means you expect it to happen, in which case it may not
be best to consider it an exceptional situation.

The normal process of handling errors via return codes is often the most
practical way of dealing with an error, especially if the caller of the
function experiencing the error can deal directly with it.

If it really is exceptional, it's likely that you can't deal with it
directly at the call site, you may have to get 10 calls up the stack to
deal with it, so it's often more manageable to throw.
Anyhow, I'm sure that there are plenty o people who would debate this,
and I'm looking forward to a constructive one.


It could be interesting!

Ben Pope.
Dec 19 '05 #13

Ben Pope wrote:
Exceptions are for exceptional situations, things which are really bad,
things you don't really know how to deal with. If you write code to
deal with it, it means you expect it to happen, in which case it may not
be best to consider it an exceptional situation.

The normal process of handling errors via return codes is often the most
practical way of dealing with an error, especially if the caller of the
function experiencing the error can deal directly with it.

If it really is exceptional, it's likely that you can't deal with it
directly at the call site, you may have to get 10 calls up the stack to
deal with it, so it's often more manageable to throw.


You could also find fully expected error situations arising several
levels down the call stack from where they need to be handled simply
because you have sensibly factored your code in many small functions
rather than few larger ones.

In such cases, even though the 'error' might be expected I find
exceptions a much cleaner control structure than having to propogate an
error code up the call stack manually. Debating the definitions of
'error situation' and 'exceptional situation' seems academic to me when
what I am really choosing between is clean code vs cluttered code.

Gavin Deane

Dec 19 '05 #14
Geo
Gianni Mariani wrote:
Ben Pope wrote:
Gianni Mariani wrote: ...
Is attempting to open a file that is not there an exception or an error?

If the file was expected to exist, or if the file was necessary for the
program to operate, then almost certainly an exception.

If the filename was entered by the user, then probably an error,
although that error could easily be propagated up the stack by an
exception...

As is often the case, it depends!


So now, exceptions are glorified cross function gotos. Probably not a
good thing.


while, for if..else.. return, break, continue... are ALL glorified
gotos, you advising against those also ?
I was on the fence for quite a while on exceptions and I'm now leaning
on a very minimal usage of exceptions. Opening a file is in almost
every case I have come across, not a case for using exceptions, even if
you expect the file to exist.

It's also very unfortunate that exception specifiers are dynamically
handled rather than allowing the compiler to do a static analysis.
Possibley, as they stand they are useless, but I'm not conviced they
have any worth anyway.

Multithreaded code is almost always impossible to manage using exceptions.

What's that got to do with anything, C++ is NOT a multithreaded
language, threading is not part of C++, exceptions are, you would be
more correct to say, use exceptions, don't use threads
I'm not trying to say exceptions are bad, I'm saying they're very
limited in utility. Also, I find it a fallacy that code is easier to
write. Handling exceptions correctly can get quite involved making the
code much more difficult to write if you have to write try/catch blocks
everywhere.
But you don't, that's the point, you only need to catch at the place
you wish to deal with the excaption, return codes on the other hand, do
need to be dealt with everywhere

Anyhow, I'm sure that there are plenty o people who would debate this,
and I'm looking forward to a constructive one.


Enjoy... :)

Dec 19 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

10
by: KN | last post by:
I know both are pretty much the same and it comes down to personal choice. But I have to make the choice for the team. Things so far that I am considering 1. XML documentation in C# -- thats...
29
by: RAY | last post by:
Hi , my boss has asked I sit in on an interview this afternoon and that I create some interview questions on the person's experience. What is C++ used for and why would a company benefit from...
113
by: Bonj | last post by:
I was in need of an encryption algorithm to the following requirements: 1) Must be capable of encrypting strings to a byte array, and decyrpting back again to the same string 2) Must have the same...
59
by: Alan Silver | last post by:
Hello, This is NOT a troll, it's a genuine question. Please read right through to see why. I have been using Vusual Basic and Classic ASP for some years, and have now started looking at...
17
by: Brett | last post by:
I'd like references on where to find some good (quality) icons to use for form and application icons (for the EXE). Most of the free stuff isn't that great looking and there isn't a good...
15
by: Alex L Pavluck | last post by:
I am new to programming other than SAS. I read that C# is a good starting language and I have started to create some simple programs with C# 2005 express edition. Can someone let me know if this...
6
by: Jamiil | last post by:
I am not a programmer by any means, but a dedicated aficionado. I have good understanding of Java and C/C++, and now I would like to learn javascript->ajax, but I don't know where to start. My HTML...
244
by: Ajinkya | last post by:
Can anyone suggest me a good compiler for(c/cpp) for windows? I tried dev cpp but its debugging facility is very poor.
76
by: lorlarz | last post by:
Crockford's JavaScript, The Good Parts (a book review). This shall perhaps be the world's shortest book review (for one of the world's shortests books). I like Douglas Crockford (because I am a...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.