|
Nontyped template parameters give the user of your template class the opportunity to determine the size of "something".
template <size_t SIZE>
class Foo
{
public:
Foo()
{
for (size_t i = 0; i < SIZE; ++i)
vals[i] = int();
}
// ...
private:
int vals[SIZE];
};
In this example, the user can determine the size of the vals array. Otherwise, you would have to hardcode the size or dynamically create it to that size if passed via a construtor.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks George L. Jackson,
Any benefits of using template class parameter compared with using constructor?
regards,
George
|
|
|
|
|
Run-time vs. compile-time! C++ gives you choices on how you want to program. Nontype template parameters can be used as compile-time expressions. My example had a constant-expression created at compile time.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks George L. Jackson,
In the past days, I read some articles about compile time and run time expression. I think using compiler to calculate the value of some constant is just come tricks, and I do not see any practical usage. Please feel free to comment and correct me if you are not agree.
Example, factorial function
http://en.wikipedia.org/wiki/Template_metaprogramming[^]
regards,
George
|
|
|
|
|
Template metaprogramming is interesting. But like everything else, it is not useful to you if you can not visualize it as so. I have found programming concepts not so useful at first glance to be very useful over time. Nevertheless, whether you use a pair of pliers or a wrench to tighten a nut, all that matters in the end, the work was completed and the customer is happy.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks George L. Jackson,
What do you think is the most useful function of template class with only parameter information without type information in practices? Could you share some experiences/samples please?
regards,
George
|
|
|
|
|
|
Thanks George L. Jackson,
Good sample!
regards,
George
|
|
|
|
|
I have some old MFC applications compiled with VC++ 6.0.
I plan on buying VS 2005 standard edition soon.
The question is
1.if I recompile it using VS 2005,Will the newly create executable file use MFC8 or it still linking with MFC42.dll ?
2.Is MFC8 dll come with every Windows XP SP2 or I have to include it in application folder(Will it conflict with the system provided one) ?
Sorry for my bad english.
Thank in advance
|
|
|
|
|
xanagan666 wrote: I plan on buying VS 2005 standard edition soon
AFAIK VS 2008 will be available by the end of the month...
don't know about your questions though, I'm a .NET guy.
Luc Pattyn [Forum Guidelines] [My Articles]
this months tips:
- use PRE tags to preserve formatting when showing multi-line code snippets
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
In addition to what the nice ".NET guy" said:
xanagan666 wrote: 1.if I recompile it using VS 2005,Will the newly create executable file use MFC8 or it still linking with MFC42.dll ?
It will require the new MFC DLL. However, you will need to check out all the breaking changes since that version. Most likely you won't have a clean recompile.
xanagan666 wrote: 2.Is MFC8 dll come with every Windows XP SP2 or I have to include it in application folder(Will it conflict with the system provided one) ?
From my experience, there is no gurantee that that DLL will be installed on a Windows XP SP2 system. However, I have not really check if this DLL is installed when the OS or service pack is installed.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
|
Thank everyone for your answer.
|
|
|
|
|
Hi all!
hope somebody can help.
I am using named pipe for communication. however i am encountering an error when calling CreateFile. GetLastError returns "The system cannot find the file specified."
it was working fine but after sometime CreateFile fails. I am not sure what is wrong. the named pipe server is still running.
also will there be a problem if CreateFile is called concurrently on the same named pipe server?
thanks for any help!
old
|
|
|
|
|
It could be the name of the pipe that is wrong that is why it can't find it. Or maybe the named pipe still has not been created when the CreateFile was executed. Posting the code snippet could help for us to know what the problem is.
|
|
|
|
|
Hi Llasus! thanks for the quick reply.
the named pipe is correct and it was working fine. i have been running it for around 2hours and after that it failed on CreateFile.
the code is similar to the sample in msdn for multithreaded namedpipe. though i have limited the pipe server instances to 25. after each successful connection it will read the data, send a reply by WriteFile then disconnect the named pipe.
for the client it will just call CreateFile then write the data and wait for the reply and close the handle.
hope to hear from u again.
old
|
|
|
|
|
So only one named pipe inside the server exists and at maximum 25 clients can access the server right?
ginjikun wrote: after each successful connection it will read the data, send a reply by WriteFile then disconnect the named pipe.
Or will the server create a named pipe for each client?
|
|
|
|
|
Hi again!
Yes, there is only 1 pipe server creating 25 instances to enable at least 25 clients to connect.
something like this for the server
for (;;)
{
CreateNamedPipe(
...,
25, // instances
...
);
// wait for clients to connect
ConnectNamedPipe(...);
...
ReadFile(...);
WriteFile(...);
DisconnectNamedPipe(...);
CloseHandle(...);
}
the client...
CreateFile(...);
WriteFile(...);
ReadFile(...);
CloseHandle(...);
again, it was working fine for a few hours then suddenly i get the error "The system cannot find the file specified." i am not sure what happened. the namedpipe server is still running.
thanks again!
old
|
|
|
|
|
Hi,
my named-pipe experience is limited, but I have some questions/ideas anyway:
- does it fail completely (all subsequent clients get no service) once it starts to fail?
- how many connections succeed before it fails the first time? 25? much more?
- how many clients did terminate abnormally before it started to fail? around 25?
I mean: maybe you are debugging the client and abort it, rather than let it finish and
close the handles and thing like that.
- you should consider adding some logging in the server (and the clients) so you can see
what is the first thing that fails, when it is, and possibly show error messages
from GetLastError() and such.
Luc Pattyn [Forum Guidelines] [My Articles]
this months tips:
- use PRE tags to preserve formatting when showing multi-line code snippets
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc! thanks for the reply!
yes, once it fails, it fails completely. no more CreateFile call is successful.
i am not sure how many successful connection were made. there was a lot since i was running it for a few hours already and every 1 minute i am sending some data.
no clients so far based on the logging terminated abonormally.
though i noticed in the logging that there was a concurrent call to CreatFile then it started to fail.
that is why i am asking what the effect is if 2 concurrent calls to CreateFile was made on the same pipe server.
thanks so much!
old
|
|
|
|
|
ginjikun wrote: there was a concurrent call to CreatFile then it started to fail
not sure what you mean here. is it two clients trying to each use a pipe at the same time?
if so, any chance that was the first time two pipes would be active together? (that would
point to some design/implementation error in the server I guess).
PS: I will be off pretty soon. You may get more help by posting more detailed description
of good operations, symptoms for bad operation, and showing more code.
Luc Pattyn [Forum Guidelines] [My Articles]
this months tips:
- use PRE tags to preserve formatting when showing multi-line code snippets
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi again Luc! and thanks again for the reply.
what i mean by concurrent call to CreateFile was that there was 2 calls to the functions i have created which calls CreateFile. i have a DLL which have exported functions for sending data.
sample code is... in my DLL
function1()
{
Log("function1 Entry");
CreateFile(..);
WriteFile(..);
ReadFile(..);
CloseHandle(..);
Log("function1 Exit");
}
there is no lock in function1. in the logging i saw
"function1 Entry"
"function1 Entry"
which means that 2 calls to this function was made even before the 1st call has finished. ideally that log should be like this
"function1 Entry"
"function1 Exit"
"function1 Entry"
"function1 Exit"
after i saw the log which have 2 entries "function1 Entry" then all succeeding logs was the failed in CreateFile. maybe the issue is not the concurrent call to CreateFile but it is in the function whereby the first call has connected already then another calls CreateFile again. will this invalidated the pipe instance previously created? i guess another question should be what if a function was called concurrently when it has not yet finished its previous processing, what will be the effect?
im lost
thanks for the help!
old
|
|
|
|
|
ginjikun wrote: i'm lost
to the contrary, you are zeroing in on the problem.
does your client code have full error checking?
every call related to pipes should check its return value, and whenever it is not good,
it should call GetLastError and log the result. That will tell you what goes wrong there
as soon as things start to go wrong.
chances are you will have to provide a lock over the entire function1.
Q: if function1 uses some variables that are not local, should they be common to all the
threads that may be running at once, or should they be local to the thread?
depending on the answer, if there are global variables, you may have to store them as
real globals or as thread-specific data (or whatever it is called).
That's it for today. Good luck.
Luc Pattyn [Forum Guidelines] [My Articles]
this months tips:
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use PRE tags to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Hey Luc!
thanks!
yes it does. it checks for errors everywhere and it calls GetLastError to log the error encountered. i have tried to add locking in function1 and have left it running for over 2 hours now. so far it is still running!
no global variables are used. all are local variables which are parameters. ooopss forgot to mention function1 takes the parameters pipename (complete with machine to connect) and the data to be sent.
function1(pipename, data)
i am still lost as how exported functions behave. is it blocking? if it has no locking and was called at the same time (almost the same time ) what will happen?
thanks! thanks!
old
|
|
|
|
|
Hi,
you're welcome.
ginjikun wrote: left it running for over 2 hours
you could get more testing done by decreasing the time in between communications; just
for testing purposes reduce the period from 1 minute to 10 seconds, or 1 second. That way
a 1 hour run simulates an actual run of 6 or 60 hours...
ginjikun wrote: how exported functions behave. is it blocking?
is several threads of the same process, or some threads of different processes, call
the same function in a (shared) DLL, then they will run any way they see fit, there is
no automatic blocking, locking, synchronization, whatever; so either your code must
be "thread-safe" (i.e. withstand such concurrent execution), or explicit locking must
be provided.
Luc Pattyn [Forum Guidelines] [My Articles]
this months tips:
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use PRE tags to preserve formatting when showing multi-line code snippets
|
|
|
|