|
3rd parameter is missing in the ReadFile()
nice info about output parameter.
here <char>is returned from the function. Can i use BYTE instead of char to read the file, is it ok or not.
Niklas Lindquist wrote: bytes_read.reserve( bytes_to_read );
MODIFIED :
<pre>std::vector<std::string> bytes_read;</pre>
I guess bytes_read is a string type.
I was bit confused. Now its ok.
Some Day I Will Prove MySelf :: GOLD
modified on Sunday, February 13, 2011 2:14 AM
|
|
|
|
|
goldenrose9 wrote: 3rd parameter is missing in the ReadFile()
You're quite right, and there's a misspelled one as well.
goldenrose9 wrote: Can i use BYTE instead of char to read the file
std::vector<BYTE> bytes_read; will do just fine. It really depends on how you would like to use the result.
However
std::vector<std::string> bytes_read; gives me the chills here. What exactly did you mean?
|
|
|
|
|
I'd have said that was true 10 years ago, but these days compilers have made that sort of trick fairly pointless. When compilers see a function of the form:
A some_function()
{
A a;
return a;
}
they're allowed (by the standard) to rewrite it as:
void some_function( memory_block_the_size_of_a &a )
{
new( &a ) A;
}
The compiler then converts the calls to that function from:
A a = some_function();
to something like:
memory_block_the_size_of_a block;
A &a( *reinterpret_cast<A *>( block ) );
some_function( &block );
a->~A();
which removes the copy construction which would normally happen with this sort of construct. The transformation the compiler does is a bit hard to represent in C++ as what it produces is usually exception safe while the representation I've done above isn't. That's the beauty of being a compiler I suppose!
This transformation is called NRVO (named return value optimisation). It's fairly unique in that it's one of the few transformations the compiler may or may not do to some code which change it's visible behaviour. NRVO was implemented in VC++ 2005 and at least gcc 4.0, but it might have been a version or two earlier, can't remember without checking.
Anyway, while you can use a reference parameter it (in my opinion at least) makes your code a lot more stilted as you end up writing two lines where you only needed one which was a direct statement of what you were trying to achieve. If you use the double ended reference type of function then you can actually end up with slower code if someone writes (naively):
A a = some_function( b );
as you still end up triggering the copy constructor. So the moral here is either provide an in/out parameter or return by value - don't fall halfway between.
Lest anyone gets a bit slap happy and starts changing large swathes of code to this style it's worth noting that the compiler can't apply NRVO if:
- The thing being returned isn't named (that's the named bit...)
- There are multiple exits from the function, even if they're all returning the same thing
- It's assignment not copy construction (so A a = some_function() can invoke NRVO while a = some_function() won't).
In addition vendors don't have to implement it but most do - if they didn't they'd just make their compilers seem bad.
While I'm banging on I should mention there's a similar optimisation for functions with a single return of an unamed temporary object called RVO. I'll only bother talking about it if there's any interest though!
Cheers,
Ash
|
|
|
|
|
As far as I know, NRVO would still have to issue a call the constructor of the return value every time the function is called. This constructor will then allocate heap memory for the vectors internal buffer. While NRVO will be reusing the same stack space for the vector object, it would not be able to re-use the memory for the internal buffer over subsequent calls to the function. The following usage of the function would only yield a single memory allocation, vector.reserve() in read_from_file(), no matter how many calls you make.
const size_t wanted_chunk_size = 512;
std::vector<char> buffer;
do
{
read_from_file(wanted_chunk_size, buffer);
write_to_somewhere(buffer);
}
while (buffer.size() == wanted_chunk_size);
I might have to brush up on NRVO though. Please correct me if I'm wrong.
I always find your posts interesting to read, so if you have time for an RVO post, that would be appreciated.
|
|
|
|
|
Aescleal wrote: you can actually end up with slower code if someone writes (naively):
A a = some_function( b );
as you still end up triggering the copy constructor.
Aescleal wrote: - It's assignment not copy construction (so A a = some_function() can invoke NRVO while a = some_function() won't).
Should I go sip another coffee or is there a contradiction?
Otherwise: great post! Didn't know about NRVO. You just gave me another weapon to fight multiple returns!
|
|
|
|
|
I think you can have that coffee. For NRVO to kick in, the returned value has to be created within that function.
|
|
|
|
|
Thanks, I'm better now.
My issue was with the paragraph preceding my first quote - I didn't get what was meant by 'double ended reference type of function'.
|
|
|
|
|
Good catch on the vector resizing BTW, I meant to do that and then was lured away from the computer by dinner.
Cheers,
Ash
|
|
|
|
|
Font of MyList (sub class of CListCtrl ) is changed by MyList.SetFont(...) function,
I need to do something when font is changed inside MyList, but WM_FONTCHANGE is not received by the list-ctrl.
Do you know which message responses to SetFont(...)?
|
|
|
|
|
WM_SETFONT[^]?
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> //TODO: Implement signature here<
|
|
|
|
|
Good answer, the SetFont[^] function sends a WM_SETFONT message.
modified 13-Sep-18 21:01pm.
|
|
|
|
|
Just override the standard SetFont() function inside your CListCtrl class.
|
|
|
|
|
Hi all,
I am trying to add Edit Box on my dialog application.
I am creating a variable name as
CString m_strEdit;
through
ClassWizard->Member variables
but when i run the application some junk value is coming on editbox and when i close the application(i.e end all the dialogs)
I am getting error.
Can someone tell me,whats going on wrong
The debug error is shown below
Debug Assertion Failed!
File:dbgheap.c
Expresion:_CtrlIsValidHeapPointer(pUserData)
Thanks
Raj
|
|
|
|
|
Have you initialised m_strEdit with any valid content before you show the dialog? As to the Debug Assertion, you should try setting some breakpoints in your application and check the call stack to see where in your application the failure is likely to be.
I must get a clever new signature for 2011.
|
|
|
|
|
Hi,
I have a 2D matrix (basically an array of data) with values between 0-255 and 'm trying to do some skewing, rotation and resizing of it using gdiplus. I can use that data to display an image using gdiplus by creating a 8bit bitmap with the array as pixel data and attaching it to a gdiplus bitmap object and using that with a gdiplus graphics object. I am not sure how I can perform skew in both directions, then rotate and then resize it as per my application requirements. At the end I would like to save the bitmap that has all those transformations applied as a tiff file (or for now as bitmap).
any help is appreciated
thanks
PKNT
|
|
|
|
|
|
Hi guys!
Sorry, this is cross post, I wasn't sure where to put it and what looked like the appropriate forum hadn't had any activity in a few weeks. I've been programming professionally for 5 years, and all the companies that I've worked for in the past have had all the development tools in place before I arrived. I'm currently starting a new job, and the company wants me to develop some in house software for their use. My question is, how do I go about choosing the correct environment(VS2008, VS2008 Pro, VS2010?). Do we need MSDN licenses? What about SDK's? I know these seem like pretty basic questions, but all of the other companies I've worked for the IT department handled these issues, and I had no control over them. This is a small company, and their first attempt at software development, I don't want them to have to buy unnecessary tools, and I don't want to be halfway through a project before I realize I've missed a huge component.
[Insert Witty Sig Here]
|
|
|
|
|
This is the C++ forum, and is for posting C++ questions only! I've answered your query in the "Running a Business" forum.
"Real men drive manual transmission" - Rajesh.
|
|
|
|
|
Thank you, again, sorry for the cross post.
[Insert Witty Sig Here]
|
|
|
|
|
Hi all,
I am trying to paste some text from another file ,but only half of the text is comming.
I am not able to display whole text message.
How can i increase the buffer size.
Thanks
Raj
|
|
|
|
|
|
Hi,
Thanks a lott.Its working
Thanks
Raj
|
|
|
|
|
You're welcome!
|
|
|
|
|
Mark his answer as "Good Answer". I only see my vote on his post right now.
"Real men drive manual transmission" - Rajesh.
|
|
|
|
|
Rajesh, I see that this is a trend.
Once their problems are solved, the OPs often forget to vote.
Thank you very much for the vote and the support!
Best Regards,
Nuri
|
|
|
|