|
I have encountered a weird namespace alias resolution bug(?) in VC++ 2003. I'm getting error C2653: 'innernamespace' : is not a class or namespace name for Orhun::Func2 (Commented out in the code provided below). Note that Func3, which is not a class method, with similar signature compiles just fine...
VC++ 2005 compiles all 3 functions without any errors.
Is this a known problem with 2003? My searches failed to return any meaningful results.
namespace topnamespace
{
namespace innernamespace
{
class Foo
{
public:
Foo() {}
Foo(int i) {}
};
}
}
namespace orh = topnamespace::innernamespace;
class Orhun
{
void Func1(orh::Foo e = topnamespace::innernamespace::Foo(-1))
{
}
};
void
Func3(orh::Foo e = orh::Foo(-1))
{}
Orhun Birsoy
|
|
|
|
|
It compiles fine on VS 2008 too.
Looks like a bug to me...I don't know if it's known or not though.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hello, Orhun Birsoy.
I resolved the problem using "using namespace":
...
namespace orh = topnamespace::innernamespace;
using namespace topnamespace; // Added
class Orhun{
...
I guess, later versions of Visual Studio are equipped with the facility which do "using namespace" automatically for namespaces declared in same file.
But I consider its original to use "using namespace" for ur example. For example, we have a havit "using namespace std;" after "#include list or map".
**SnowFall**
-- modified at 22:45 Wednesday 14th November, 2007
|
|
|
|
|
I have to appoint an integer variable to another integer pointer itself. I tried this:
<br />
sNumber& DrawNumber()
{<br />
<br />
sNumber* pNum = new sNumber;<br />
pNum->i1 = edi1;<br />
pNum->i2 = edi2;<br />
<br />
}<br />
sNumber& sn = DrawNumber();<br />
for(int i=0; i<2; i++)<br />
{<br />
int x1 = sn.pNum[i]; <br />
int x2 = sn.pNum[i];<br />
}<br />
How much its right or wrong? have you got other any bookmarks on this topic? I have no possibility to compile this codes.
-- modified at 13:28 Wednesday 14th November, 2007
Was is das¿
|
|
|
|
|
I'm going to have to go with it is a lot wrong, but can't say where because I have no idea what you are asking.
|
|
|
|
|
Well abase... You are mean that it is impossible to appoint an integer variable to an integer pointer. Anyone can help me?
Was is das¿
|
|
|
|
|
Hakan Bulut wrote: it is impossible to appoint an integer variable
What does "appoint" mean? Are you in school? Did they teach you that word? It's wrong, it is not a standard term used in software development. You need to learn the proper terminology and use it for text based communications to succeed.
|
|
|
|
|
led mike wrote: What does "appoint" mean?
Right when I posted my first reply, I realized I forgot to ask that.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sorry, I could not remember what was mean it in computers literature.
Was is das¿
|
|
|
|
|
Hakan Bulut wrote: Sorry
how does that help?
Hakan Bulut wrote: I could not remember
Then go find out first so you can use the correct terms when posting questions.
|
|
|
|
|
Assingment.. I just to mean assing a variable to an integer pointer itself where in the sNumber structure and to objective oriented these elements to using easy?.. Have you got an idea OOP method?
Was is das¿
|
|
|
|
|
sNumber& DrawNumber() //pointer itself.
What does "pointer itself" mean? Your function returns a reference
{
sNumber* pNum = new sNumber;
pNum->i1 = edi1;
pNum->i2 = edi2;
You need to return a value from the function.
}
sNumber& sn = DrawNumber();
for(int i=0; i<2; i++)
The DrawNumber function (supposedly) returns a reference to a sNumber object.
How can you iterate through an array of two objects??
{
int x1 = sn.pNum[i];
int x2 = sn.pNum[i];
There's no such thing as "pNum" here.
}
Pretty much none of this makes sense
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yeah how can i iterate thorough an array of two object. I just to mean that. So "sn" what has been refered to? What should i it to do? Can you help me?
"The DrawNumber function (supposedly) returns a reference to a sNumber object." I can see it. Anyway I asked this question myself. I don't asking about this function does returns a reference to a sNumber object. [I just ask how can i appoint an integer variable to an integer pointer sn referred object.?]
What do you say? it's no required?
-- modified at 13:52 Wednesday 14th November, 2007
Was is das¿
|
|
|
|
|
Hakan Bulut wrote: how can i iterate thorough an array of two object.
You need to have that array to begin with.
I'm not sure where to start here....this is really C/C++ fundamentals that I'm not sure if you know or not.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
A project which took 2.5 mins to compile is now taking more like 12 mins, and I've noticed that the PCH file is 22MB where it used to be 11MB. Could that be part of the slowdown? How much of an effect does the size of a PCH file have on compilation? Does it get loaded when each individual file is compiled or just once at the beginning? I'm being driven nuts waiting for it to compile when I've only made a small change to one header file!
TIA.
PS - it's about a 280kloc project in VC6.
|
|
|
|
|
delete it and start a clean + rebuild all. it's a known bug that its size a getting bigger and bigger sometimes.
|
|
|
|
|
Hi C++ coders,
Im developping two softwares that need to communicate with each other over a network. The IPC mechanism we chose is the named pipes. Both softwares are being developped in C++.
When I did my preliminary tests, everything went fine but performance was not that good. I read that I needed to send and receive data asynchronously, which made sense to me.
So I changed everything to incorporate asynchronous overlapped I/O.
Here is what my softwares do:
Software A creates about a dozen named pipes.
Software B connects to those pipes.
Now, software A sends data through pipe #1. Pipe #1 was designed to send and receive blocks of 112 bytes. This data is received correctly by software B.
Up to here, everything is ok.
Then, software A sends data through pipe #2. Pipe #2 was designed to send and receive blocks of 153,268 bytes. This data is NOT received correctly by software B.
When I do my tests locally (on one pc running both softwares), this block of 153,268 bytes is sent and received correctly.
So my assumption is that there is something wrong with sending and receiving large blocks of data through named pipes over a network.
I read on different forums that there is a limit on the size of data that can be sent through named pipes over a network.
I tried everything I could find on the Internet, but didnt find anything that would work.
My questions are:
If a ReadFile or WriteFile call returns false, and that GetLastError() returns ERROR_IO_PENDING, what should I do to make sure the data is written or read entirely?
Should I call GetOverlappedResult()?
Does a call to GetOverlappedResult() keeps on reading or writing or should I call WriteFile or ReadFile again and again until its done?
Should I wait for the event that was specified to the Overlapped structure?
If someone asks, I can post the code I use.
Thanks.
Benjamin Racette
CAE software developer
racette@cae.com
|
|
|
|
|
racette wrote: The IPC mechanism we chose is the named pipes.
racette wrote: If a ReadFile or WriteFile call returns false, and that GetLastError() returns ERROR_IO_PENDING, what should I do to make sure the data is written or read entirely?
Should I call GetOverlappedResult()?
Does a call to GetOverlappedResult() keeps on reading or writing or should I call WriteFile or ReadFile again and again until its done?
Should I wait for the event that was specified to the Overlapped structure?
So you chose Named pipes before you knew how they worked? Interesting. There should be numerous articles and tutorials on using Overlapped IO on MSDN and probably here in the articles on CodeProject. Look around sometime, you might find you get what you need.
|
|
|
|
|
led mike wrote: So you chose Named pipes before you knew how they worked? Interesting.
I said WE chose since I wasn't the only one deciding.
Also, the choice of named pipe was made for performance issue rather than our knowledge of the technology.
led mike wrote: There should be numerous articles and tutorials on using Overlapped IO on MSDN and probably here in the articles on CodeProject. Look around sometime, you might find you get what you need.
I have read a lot on forums and on MSDN but it seems like there is conflicting information; what I mean is that different sources offer different solutions, but none of them seems to do the trick for me. Go to MSDN and look at the GetOverlappedResult() function documentation. When I read it, it seems like that function doesn't do anything except return the result of the last overlapped operation that used the overlapped structure, but on other sources, from what I understand, it seems that GetOverlappedResult() does continue to read or write. I just want accurate information thats all.
Thanks!
Benjamin Racette
CAE software developer
racette@cae.com
|
|
|
|
|
racette wrote: I said WE chose since I wasn't the only one deciding.
Also, the choice of named pipe was made for performance issue rather than our knowledge of the technology.
I said you as opposed to you all but that is what I meant. However I find your statement confusing. You (all) choose it form performance reasons without knowledge of the technology? So I guess that means you read some claims about performance and so you (all) decided? Or what?
racette wrote: I just want accurate information thats all.
Then I suggest you read the documentation
On the page for GetOverlappedResult, at the bottom, there is section titled "See Also" and in there is a link titled "Overlapped Input and Output". At the bottom of that page it says:
For examples that illustrate the use of overlapped operations, completion routines, and the GetOverlappedResult function, see Using Pipes.
where "Using Pipes" is a link to a page that has multiple example links. There are several including one for using Overlapped IO and another for using Completion routines. If you haven't figured this out yet, you should read both.
Please keep in mind these examples illustrate and comment on how the API's work. They are NOT an example of a good software design using the API's.
|
|
|
|
|
led mike wrote: So I guess that means you read some claims about performance and so you (all) decided? Or what?
Yes. We found a benchmark showing that named pipes could accomplish what we want with the performance we want.
led mike wrote: Then I suggest you read the documentation
As I said already, I have read a lot before posting here. Of course I read those articles you mention, a couple of times each, but I still can't figure out how to do it. What I can see is that overlapped IO is used A LOT in the win32 API, not only with named pipes, so the examples rarely apply to what I am doing.
Benjamin Racette
CAE software developer
racette@cae.com
|
|
|
|
|
racette wrote: Of course I read those articles you mention, a couple of times each
Good that gives us some reference.
racette wrote: but I still can't figure out how to do it.
Ok let's work off the examples and you point out what you don't understand. Last modified: 3mins after originally posted -- ooops... clicked the wrong button
|
|
|
|
|
led mike wrote: Ok let's work off the examples and you point out what you don't understand
ok.
First, I created my named pipes with the FILE_FLAG_OVERLAPPED and PIPE_WAIT parameters. Then, for each call to ReadFile and WriteFile, I specify a distinct OVERLAPPED structure in which I specified a distinct event.
After each call to WriteFile and ReadFile, I verify the return value. If its TRUE, then the data has been sent/received correctly. If it's FALSE, then I verify the value of GetLastError(). If GetLastError() returns ERROR_IO_PENDING, Im not sure what to do. (note that if it's any other kind of error I just close the app)
I want to make sure all the data has been sent/received.
I read that I can either call GetOverlappedResult() or wait for the event I specified to the overlapped structure with a call to WaitForSingleObject().
I tried both, but it does not seem to work. It does work locally (both softwares running on the same pc) but it does not work over the network. I seem to get only 4212 bytes out of my 153,268 bytes.
It is so weird!
Also, I have the perfect example of conflicting information on the MSDN website:
On this web page
http://msdn2.microsoft.com/en-us/library/ms686358.aspx
you can read in the fourth paragraph that "To call a function to perform an overlapped operation, the calling thread must specify a pointer to an OVERLAPPED structure that has had all of its members initialized to zero."
Then on this web page
http://msdn2.microsoft.com/en-us/library/ms684342.aspx
look at the description of the 'Pointer' parameter. It says "Reserved for system use; do not use."
Now what should I do? set it to zero? it's a pointer!!!!!!
The same goes for hEvent.
I just can't seem to find accurate information.
Anyway, thanks for your reply.
Benjamin Racette
CAE software developer
racette@cae.com
|
|
|
|
|
Ok well that's a lot of stuff. Perhaps you might like this idea, I suggest you take the example "named pipe server using overlapped IO" and the matching "named pipe client" and build them and execute them and watch. Watching with the debugger might prove difficult due to the async operations but if you add some logging to the code you should be able to get a better understanding of what happens and therefore how this all works.
|
|
|
|
|
Thanks for the suggestion.
I saw that example a while ago and though it did not apply to me since I use a thread for every pipe I create.
I like the idea of debugging it (stepping in the code). I will do just that and come back to you.
Thanks!
Benjamin Racette
CAE software developer
racette@cae.com
|
|
|
|