|
To know how many characters in the formatted string are needed to allocate,
use _vscprintf an then use new or malloc with the number of characters returned.
|
|
|
|
|
Perspx wrote: how do I work out how many characters the integer will take up?
Why bother? Assume the worst case and allocate room for 10, or 20 if you are on a 64-bit machine.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
That's bad programming and a waste of resources.
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
Perspx wrote: That's bad programming and a waste of resources.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
You can laugh but I bet that the reason that most Microsoft programs are slow and clunky is because the programmers who write them do bad programming techniques such as that.. and it doesn't matter for that particular example, as that only wastes 19 bytes at the maximum.. but if you apply that technique for other data allocation, then you could waste a lot more which makes your application unreliable and not perform so well..
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
Please continue!
It's amazing!
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.
|
|
|
|
|
Perspx wrote: I bet that the reason that most Microsoft programs are slow and clunky...
I highly doubt that. Reserving 1 byte or 20 bytes from the stack will make no noticeable difference in your code's execution time, but using the log10() function and asking the memory manager for countless small amounts of memory will.
Consider the following:
for (int x = 0; x < nFileCount; x++)
{
int nLength = (int) (log10(dwFileSize) + 1.0);
char *s = new char[18 + nLength];
sprintf(s, "File Size: %lu bytes", dwFileSize);
delete [] s;
} compared to:
char s[28];
for (int x = 0; x < nFileCount; x++)
{
sprintf(s, "File Size: %lu bytes", dwFileSize);
}
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Perspx wrote: That's bad programming and a waste of resources.
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.
|
|
|
|
|
Is that a laugh at me or in agreement?
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
To solve that problem mathematically: take the logarithm to base 10 (double log10(double))and add 1.
Else you can format it into a CString and check that length.
Greetings,
Martin
edit: sorry, used the wrong log function (base e instead of base 10)
-- modified at 10:22 Friday 3rd August, 2007
|
|
|
|
|
m.dietz wrote: To solve that problem mathematically: take the logarithm to base 10 (double log10(double))and add 1.
First make sure the value is greater than zero.
m.dietz wrote: Else you can format it into a CString and check that length.
the above works anyway.
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.
|
|
|
|
|
. I leave you as an exercise the extension to n<=0 .
int howmanychars(int n)
{
return (int)log10(n) + 1;
}
BTW of course you don't need it
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.
|
|
|
|
|
Thank you
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
Please note: I gave you the function only for informative pourposes (an academic exercise): you really don't need it. Moreover it will slow down your code.
BTW: Think a bit before giving judge on programmers slowness, with David Crow you surely miss the target.
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.
|
|
|
|
|
Yeah I know.. I'm not even a professional programmer :p but I really hate Windows programs which are really slow and clunky and don't manage resources well.. I'm not having a go at him, I'm grateful for the advice from him and everyone.. I'm just sure that there must be an efficient way of doing this and throwing memory away unnecessarily is a bit of a waste.. Don't you agree?
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
Perspx wrote: ...don't manage resources well
Don't forget, memory is not the only resource a computer has. Sounds to me like you're wasting the CPU time (another resource) in order to save a few bytes of memory. It's hard to imagine a case where those few bytes would ever matter. There's also the factor of code complexity -- sounds like you're making your code more complex than it needs to be.
Since you're calculating size, I'd guess you're going to be allocating memory dynamically through malloc or new[] etc. Those schemes will add their own overhead which will swamp the few bytes you're aiming to save.
Perspx wrote: Don't you agree?
In principal, yes, don't waste resources. However, I think you're going overboard in this case (the other posts seem to agree).
|
|
|
|
|
Ok yes I see what you are all saying..
Thanks everyone
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
|
|
|
|
|
CPallini wrote: hink a bit before giving judge on programmers slowness, with David Crow you surely miss the target.
Yep, that's the least we can say.
|
|
|
|
|
Hi chaps,
Does anyone know of a hack I can use to prevent a modal dialog from closing when I call EndDialog()?
What I want is for my dialog to behave just like a normal modal dialog in all aspects except that when it reaches the end of it's modal loop it exits as normal, DoModal returns a value, but the dialog doesn't actually close. So that I can call DoModal() on it once again without the dialog disappearing and re-appearing. It only closes when I explicitly kill it (or when the object goes out of scope).
Anyone know if this is do-able?
Thanks,
Jim
|
|
|
|
|
I'd rather replace the OK button with a button of your own, and hide the dialog instead. You can start to destroy a dialog and then force it to stay alive. You need to use a modeless dialog, emulate the modal dialog, and hide/show it when you need, and destroy it once at the end.
|
|
|
|
|
Yeah, I'm pretty much resigned to that. Dagnabbit.
Thing is, it's a progress dialog that keeps the user informed of the progress of a worker thread, which means we have to allow Windows to run it's message pump to update the dialog. If it's modal this isn't a problem. What is the problem is that now we want to change it such that the worker thread may now run more than once. This again works OK except that the dialog pops down when the thread has finished only to pop up again moments later when the thread runs again.
It's not so much changing the dialog to be modeless it's more that I will have to change all the calling code to have to return to Windows to allow the message pump to run and then have a handler to pick up when the thread has finished. It means changing a lot of working code to fix a minor UI irritation. Damn. If a hack like I described were possible it save a lot of work.
Still, since posting it has occurred that I might be able to fix it by moving the loop to be inside the dialog.
Jim
|
|
|
|
|
Hello!
I have a digitals that contain a local time (1387475976). How I can recieve the correctly filled SYSTEMTIME struct? I try to use next code, but it is wrong:
__int64 ull(1387475976);
FILETIME lpFileTime;
SYSTEMTIME SystemTime;
memcpy(&lpFileTime, &ull, sizeof(__int64));
FileTimeToSystemTime(&lpFileTime, &SystemTime);
cout << SystemTime.wYear << endl;
In out SystemTime.wYear = 1601
Thanks,
Andrey
|
|
|
|
|
myshketer wrote: I have a digitals that contain a local time (1387475976).
Does this represent the number of 100-nanosecond intervals since 1-January-1601?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I thinked it is... but investigation show that it number too small
|
|
|
|
|
That all depends on what you mean by "too small." Since there are 36,000,000,000 100-nanosecond intervals per hour, the value 1,387,475,976 is still within January 1st, 1601. Make sense?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|