|
Finally I realized that to return FALSE in OnInitDialog solves it, too.
Maxwell Chen
|
|
|
|
|
Just looking for a point in the right direction. I need to enumerate the existing network connections (like those listed in "Connect To"...
Would like to be able to determine which is active and other characteristics of the connection, including the underlying device...
Where should I look? (I hope it's not WMI)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<a href="http://www.soonr.com">SoonR Inc -- PC Power delivered to your phone</a>
|
|
|
|
|
Have you looked here?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi all,
Say I want to find the number of characters in a string. In simple way, get the length of the string and then count the numbers of space, tabs and the difference gives the number of characters. Here is a simple code.
int iSpace = 0;
int iRet = 0;
int iTabs = 0;
int iLength;
string strString("One Two Three ");
iLength = strString.length();
for(int i = 0; i<ilength;i++)>
{
if(strString.at(i) == ' ')
{
iSpace ++;
}
if(strString.at(i) == '\t')
{
iTabs ++;
}
if(strString.at(i) == '\r')
{
iRet ++;
}
}
cout << (iLength - (iSpace + iTabs + iRet));
cout << endl;
<pre>
Should I do anything more on this to make more reliable the result. :-D
I appreciate your help all the time...
Eranga
|
|
|
|
|
The character classification functions may help you
MSDN link[^]
they let you do things like:
char c;<br />
..<br />
if (isspace(c)) {}<br />
<br />
if (isalnum(c)) {}<br />
<br />
etc
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
Where did you find the newline character there.
I appreciate your help all the time...
Eranga
|
|
|
|
|
If you checked the link you would find:
isspace returns a nonzero value if c is a white-space character (0x09 – 0x0D or 0x20).
Thus isspace(c) tests if c is whitespace, including \r, \n, \t and space. It is done with a lookup table so is much faster than a bunch of if() statements.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
Ok, that mean if what I have to do is, find the number of spaces(that is altogether spaces, newline, tab space) and the length of the string, difference gives the number of characters. I'll try it right now.
I appreciate your help all the time...
Eranga
|
|
|
|
|
Use if(...==...) is not good.
Use like what cp.... told.
|
|
|
|
|
wira1guys wrote: Use if(...==...) is not good
Why?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Yes, why is that. Even me confusing on this.
I appreciate your help all the time...
Eranga
|
|
|
|
|
CPallini wrote: Why?
In case if you make a typo.
if(A == B)
if(A = B) // Oops!
Maxwell Chen
|
|
|
|
|
I think it could be happened on typing mistakes.
I appreciate your help all the time...
Eranga
|
|
|
|
|
You're kidding me.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
No way pal. What I'm try to say is that, use of == style is more easy and more reliable as far as I know. That's why I use the same way also. Chen says that there can be an issue on == style against = style. So the only way to happened is mis-type of the code, isn't it?
I appreciate your help all the time...
Eranga
|
|
|
|
|
This is nonsense! There is nothing wrong with testing
if (c == '\n') {}
some folk suggest that you write:
if ('\n' == c) {}
as this results in an error if you type '=' instead of '==' but I find this hard to read so I use the first form. Most compilers will issue a warning for assignment in comparison operations these days.
I mentioned the isspace() function as when I see people testing for the whitespace characters it looks as if they don't know about it. It is much more efficient. If it is not what you need and you have to test for multiple characters, it is much more efficient to do:
switch (c)<br />
{<br />
case '\n':<br />
case '\r':<br />
case '\t':<br />
case ' ':<br />
..<br />
break;<br />
...<br />
}
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
cp9876 wrote: If it is not what you need and you have to test for multiple characters, it is much more efficient to do:
switch (c)
{
case '\n':
case '\r':
case '\t':
case ' ':
..
break;
...
}
As general rule, yes. Anyway compilers are enough smart nowadays,
at least whenever optimization is turned on, as in VS Release Build:
if (myString[i] == '\n' || myString[i] == '\r' || myString[i] == '\t')
00401040 movzx ecx,word ptr string L"hello world" (4020F4h)[edx*2]
00401048 cmp cx,0Ah
0040104C je test003+4Ah (40105Ah)
0040104E cmp cx,0Dh
00401052 je test003+4Ah (40105Ah)
00401054 cmp cx,9
00401058 jne test003+4Dh (40105Dh)
{
count++;
0040105A add esi,1
}
switch(myString[i])
0040105D movzx ecx,cx
00401060 cmp ecx,9
00401063 jl test003+62h (401072h)
00401065 cmp ecx,0Ah
00401068 jle test003+5Fh (40106Fh)
0040106A cmp ecx,0Dh
0040106D jne test003+62h (401072h)
{
case '\n':
case '\r':
case '\t':
count++;
0040106F add esi,1
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
You are right, for a few cases the difference may be negligible.
My understanding is that the switch statement can be optimized to O(log(N)) operations (using a tree type of search), whereas the simple cascaded if's will be O(N) operations. Obviously these could be the same but the compiler knows it can optimize a switch statement as the cases are all integer constants. I'd be interested to know the results if anyone can be bothered to do some test cases and analyse the code. It may be that the way the case statements are tested using less than operations is indicative that it would use a tree search for more cases (instead of the simple comparisons in the if construct).
Typically for lexical analyzers there are many cases and this type of optimization can be important (even better to use the provided character classification functions like isspace())
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
cp9876 wrote: You are right, for a few cases the difference may be negligible.
In fact there is no difference at all, in the code snippet shown.
cp9876 wrote: My understanding is that the switch statement can be optimized to O(log(N)) operations (using a tree type of search), whereas the simple cascaded if's will be O(N) operations. Obviously these could be the same but the compiler knows it can optimize a switch statement as the cases are all integer constants. I'd be interested to know the results if anyone can be bothered to do some test cases and analyse the code. It may be that the way the case statements are tested using less than operations is indicative that it would use a tree search for more cases (instead of the simple comparisons in the if construct).
OK, got the point.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
CPallini wrote: In fact there is no difference at all, in the code snippet shown
There is - and depending on the distribution of characters one will be better than the other. My suspicion is that on normal text that the case statement will perform very slightly worse. Note that in the if statement all three tests are always performed. In the case statement the compiler analyses the case values and provides a short-cut if the value is < 9 - all other testing is bypassed. It was a good try and it didn't know that the data was positive, so providing a shortcut if the value was > D would have provided significantly better performance.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
You're right. I missed the shortcut inside the switch statement.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Even me believe == style is a good way, as I said all those things can be happened because of the wrong typing.
I have one question. I can use a one if() condition rather than few case conditions. Is there any special advantage use of switch-case combination than if() condition.
I appreciate your help all the time...
Eranga
|
|
|
|
|
Eranga Thennakoon wrote: Is there any special advantage use of switch-case combination than if() condition.
I prefer switch for the below manner.
enum STATUS { St_A, St_B, St_C };
MyClass::STATUS MyClass::GetStatus();
switch(GetStatus())
{
case MyClass::St_A:
case MyClass::St_B:
default:
}
Maxwell Chen
|
|
|
|
|
Eranga Thennakoon wrote: if(strString.at(i) == ' ')
{
iSpace ++;
}
if(strString.at(i) == '\t')
{
iTabs ++;
}
if(strString.at(i) == '\r')
{
iRet ++;
}
This is a moot point since a better solution has already been provided but I wanted to mention it anyhow. It does not make any sense to test a character three times when it can have only one value. In other words, if you find it to be a space, why check to see if it is also a tab or return? Use else with the latter two conditions.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Another solution might be:
int nCount = std::count(strString.begin(), strString.end(), ' ');
nCount += std::count(strString.begin(), strString.end(), '\r');
nCount += std::count(strString.begin(), strString.end(), '\t');
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|