|
DavidCrow wrote: What's to do other than respond to the messages that the library is sending? If the messages are being posted (rather than sent), you do not even have to respond to them in a timely manner.
Thanks for the reply.
I think that the library is used for customers.
So it has the timeout functionality to prevent from the wait of customers.
If I don't receive the the library-defined message(might be network error or other reasons).
I will show the related message to the customers, not waiting for the response infinitely.
That's why I think the docoument asked the developers to do timeout functionality.
|
|
|
|
|
Hi All,
I want to display a large bitmap inside a picture control.I want the picture control to display the vertical and horizontal scroll bars automatically when the image size is larger than the picture control.How do i achieve this.Please help.
Thanking all in advance,
Ashwath.
|
|
|
|
|
I have just begun using C++ and cannot seem to figure out an effective way to accept thousand separators (Only commas) in a simple program.
Basically, I need to be able to validate whether a number (given by the string argv[1]) is correctly formatted or not, before I remove all commas and convert it to double/float.
Valid Input: +1,234.5E-1,234.5 (even +a,bcd.eE-a,bcd.e for now) >> Output: +1234.5E-12345.5 (+abcd.eE-abcd.e)
Invalid Input: 1,0 >> Output: X
Any help regarding this issue would be greatly appreciated.
|
|
|
|
|
why dont you look at regular expressions ? - they allow you to 'describe' what input should look like and then perform match tests for example
The other issue you might have, is, if you are writing for an international audience, the thousands separator is different depending on there you are :-
Aus : 1,234.00
France : 1.234,00
just two examples ...
ps .. as a start for your regular expression, consider
([0-9\-\+\.].)
the [] denote the start of a 'character 'set' - there some predefined ones like :digit:, :alpha: , in this case Im saying match any character from 0 to 9, ie 0 1 2 3 4 5 6 7 8 9 .. -, +, . usually have a meaning in a regular expression (regex) to that need to be 'escaped' to say treat them as is.. the last '.', ie right before the right bracket ')' , is not escaped, which means '1 or more repetitions (iirc) else what that would match would be a single digit number .. the () denote a 'match sub/group' - so if I had an array of matches returned by a regex, match[0] would be the entire matched expression, match[1] would be the first bracketed set etc
anyway, Im waffling - do a google on regular expressions, play with them in the language of your choice - they are well worthwhile spending time on
'g'
|
|
|
|
|
Are you taking internationalization into consideration? I mean, ten thousand is still ten thousand whether you write it as 10000 or 10,000 or 10 000.
Can you not just remove the commas and then convert using something like _gcvt() ?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
me again - see this for a starter
http://onlamp.com/onlamp/2006/04/06/boostregex.html[^]
unfortunately a smaller regex library John Maddock had on is home pages seems to have gone (it was an ourworld.compuserve account, so you'll have to download and build boost, which is where the library has gone anyway - well worth it even if you just build the regex library)
'g'
|
|
|
|
|
Just parse it; the code isn't at all difficult.
One of the lessons of programming is that simple brute force code is quite common and very effective. Don't think fancy, just think simple.
|
|
|
|
|
Thank you for all of your help. But I need to be able to perform the code without any additional downloads (such as the <regex boost.htp=""> library). Parsing it sounds like a good option at the moment. Also, I only have to deal with comma thousand separators, but I need to be able to tell whether they are valid or not (1,000,000 = Valid, 1000,000 = Invalid)
|
|
|
|
|
awesometrickycool wrote: ...I need to be able to tell whether they are valid or not (1,000,000 = Valid, 1000,000 = Invalid)
Why is that invalid? It's still one million.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Yes, but if i were to remove all commas, then ,,,1,0,,000,00 would also be valid. So I just want to remove the valid commas (Eg. 1,000,000 = 1000000 (valid). 1,000,00,0 = 100000,0 (invalid). Sorry if this is a bit confusing.
|
|
|
|
|
awesometrickycool wrote: Sorry if this is a bit confusing.
Not confusing, but trying to account for every possible combination of digit separator (not all countries use a comma) is not a trivial task. A regular expression could be used after the fact to verify what was entered. A masked edit control could be used during the time of input.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Parse the string, counting digits. If you get to more than three before the first comma (or period), error. If you don't get exactly three before the next comma or period, error. And so forth.
|
|
|
|
|
But how would this work for a complex variable such as +1,234.5E-1,234.5? And what is the command for parse (How do I begin to write such a code)?
|
|
|
|
|
You'd have to pull out the two numbers from both sides of the E to see if they are valid.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Starting point off top of my head:
(I emphasize STARTING. I wrote this in less than ten minutes, it probably doesn't compile or even work, but is similar to code I've written. There are a myriad of ways to do this. For error reporting, you could use an index instead of incrementing the string [i.e. pStr[offset] ]
The main point is that it's just plain code, nothing fancy. No tricks. And will be very fast.)
inline
bool IsNumber(TCHAR ch)
{ return ch >= '0' && ch <= '9'; }
bool ParseVal(LPCTSTR& pStr, float& val)
{
val = 0.0f;
bool isNegative = false;
if (*pStr == '+')
{
pStr++;
}
else if (*pStr == '-')
{
pStr++;
isNegative = true;
}
if (!IsNumber(*pStr))
return false;
bool firstSegment = true;
int count = 0;
while (*pStr)
{
TCHAR ch = *pStr++;
if (ch == 'E' || ch == ' ')
{
break;
}
else if (ch == ',' || ch == '.')
{
if (firstSegment)
{
firstSegment = false;
if (count > 3)
return false;
}
else
{
if (count != 3)
return false;
}
count == 0;
}
else if (IsNumber(ch))
{
if (++count > 3)
return false;
}
else
{
return false;
}
}
return true;
}
|
|
|
|
|
Thanks for your reply. I ended up creating the following code: (However, it cannot deal with commas in the exponential)
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str(argv[1]);
int count = 0;
int i = 0;
if((str[0] == '-')||(str[0] == '+'))
{
count = -1;
}
bool firstSegment = true;
while((count < 4)&&(i < str.size()))
{
if((str[i] == 'E' )||(str[i] == 'e')||(str[i] == '.'))
{
if((count == 3)||(firstSegment == true))
{
i = (str.size() - 1);
}
else if(firstSegment == false)
{
cout << "X" << endl;
count = 3;
i = (str.size() - 1);
}
}
else if(str[i] == ',')
{
if(firstSegment == true)
{
firstSegment = false;
if((count > 3)||(count == 0))
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
else
{
if(count != 3)
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
}
else
{
count++;
}
i++;
}
if((count!=3)&&(firstSegment == false))
{
cout << "Y" << endl;
}
cout << str << endl;
return 0;
}
What would be the best way to handle exponential commas? And is there any easier (smaller) way to handle the above code? (I had a small look into locales but cannot seem to get them to work).
|
|
|
|
|
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str(argv[1]);
int count = 0;
int i = 0;
if((str[0] == '-')||(str[0] == '+'))
{
count = -1;
}
bool firstSegment = true;
while((count < 4)&&(i < str.size()))
{
if((str[i] == 'E' )||(str[i] == 'e')||(str[i] == '.'))
{
if((count == 3)||(firstSegment == true))
{
i = (str.size() - 1);
}
else if(firstSegment == false)
{
cout << "X" << endl;
count = 3;
i = (str.size() - 1);
}
}
else if(str[i] == ',')
{
if(firstSegment == true)
{
firstSegment = false;
if((count > 3)||(count == 0))
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
else
{
if(count != 3)
{
count = 4;
}
else
{
str.erase(i,1);
count = 0;
i--;
}
}
}
else
{
count++;
}
i++;
}
if((count!=3)&&(firstSegment == false))
{
cout << "Y" << endl;
}
cout << str << endl;
return 0;
}
That might be a bit easier to read...
|
|
|
|
|
Just scanned over the code. With some work, you could probably get the entire algorithm smaller, but the size would be negligible (and since you've bloated it up using string and cout, why bother ) Joking aside, this will result in fairly small, fast assembly.
For the exponential commas, write another function! If you find a way to combine them, that's great, but not worth worrying about.
(A big mistake a lot of programmer's make is thinking there is an all-in-one algorithm to solutions. The irony is that multiple, simple, algorithms are usually faster, easier to debug and may ultimately even be smaller. At the very least, writing things first as multiple, simple algorithms may help you see how to make a more complex algorithm that does more.)
|
|
|
|
|
How do locales work? And can they be used for the type of output I'm looking for? Just wondering...
|
|
|
|
|
Don't know how in plain C/C++, I program only in Win32.
For Win32 the function is GetLocaleInfo().
To get the thousand's and decimal separators. Call:
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, separator, 2)
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, separator, 2)
The full list of constants is at:
http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx[^]
To speed things up, just make each call once at beginning of function.
|
|
|
|
|
Hi!
I'm working on a project (LogMap) using wxWidgets and glut, in linux. When I link dynamically everything goes ok. But when I try to link statically, ld gives an error message:
g++ *.cpp -static -lglut `wx-config --libs` `wx-config --cxxflags` `wx-config --gl-libs` -o logmap
/usr/lib/gcc/i586-suse-linux/4.4/../../../../i586-suse-linux/bin/ld: cannot find -lglut
collect2: ld returned 1 exit status
Does anyone have an idea of what is happening? Any idea of how to solve it?
Thanks in advance.
|
|
|
|
|
Does the libglut.a file exist on your system?
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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
I cannot find neither libglut.a nor any wxWidgets libraries in .a format. It means I cannot statically compile, doesn't it?
I'm trying to find them in internet. Any help would be appreciated.
|
|
|
|
|
At least, I suppose, you may build yourself the static library.
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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
That's what I'm trying to do right now.
|
|
|
|
|