|
Handle WM_CTLCOLOREDIT and WM_CTLCOLORSTATIC
~RaGE();
|
|
|
|
|
almost impossible.. thats the default implementation .. but have try by subclassing and redrawing control!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
Hi,
Can anyone tell me as why i face a problem with the following code.
Problem: The size of int and float in 4 bytes each and that of char is 1 byte. But when I print the sizeof the object of class A, it prints it as 12. what could be the reason?
class A
{
public:
char c;
int a;
float b;
};
void main()
{
A objA1;
int size = sizeof(A);
cout << size << endl;
}
|
|
|
|
|
Because the members of your structure are aligned on some boundaries (which can be modified with the #pragma pack macro). In your case, the members are aligned on 4-bytes boundaries:
c: 1 byte and start at byte 0
a: 4 bytes but start at the next 4-bytes boundary so at byte 4
b: 4 bytes and start at byte 8
Thus, that makes 12 bytes for your structure.
|
|
|
|
|
Thank you very much.
But still I have some more doubts on this. Why is it behaving like this only when a 'char' variable is declared? If I dont have a 'char' variable declared in the below snippet then it shows the size correctly as 16(int 4,float 4 and double 8). In case I include a 'char' varialbe then it shows the size as 24. why so?
class A
{
public:
// char c;
int a;
float b;
double d;
};
void main()
{
A objA1;
int size = sizeof(objA1);
cout << size << endl;
}
Could you please clarify me on this please.
|
|
|
|
|
I had a deeper look at that and I think I was a little bit wrong in my first answer.
First, the purpose of having structure alignment is for optimizing the speed. It is faster to get the data at once rather (so, contained in the same 8 bytes block starting at an index multiple of 8) than needing to get it in two operations (get the first part that is contained in the previous memory block from the second part).
Thus, for 32 bits systems, memory blocks are accessed in 8 bytes blocks. Thus, the member will be contained completely in a 8 bytes block.
So, let's take your example:
First, you put your char: 1 byte.
Then you have your integer (4 bytes): there is enough space to put it there so you have 5 bytes
Then, your float (4 bytes): there is not enough space left in the previous memory block so make it start in a new block (and add 3 padding bytes in the previous block). That makes 12 bytes.
The double now (8 bytes): there is not enough in the previous block so padd it with 4 bytes and put the double in a new memory block.
So, in total, that makes 24 bytes.
So, I was wrong in my first post: your member struct alignment is set on 8-bytes boundary (and not 4). And that is more logical because it is the default value.
I hope this is clear. Sorry for my previous post.
|
|
|
|
|
Because the compiler will aligned your struct.
The principle is flowing: alignment must accoring to the largest member size. so this struct will be aligned as 8 bytes(double).
|
|
|
|
|
Sorry that I got confused a bit.
I am not fully satisfied with the clarification you gave in the previous update.
Consider only 3 variables declared char(1 byte),int(4 bytes) and float(4 bytes). As you said in a 32-bit system the memory block size would be 8 bytes. In that case, the first block of 8 bytes is first allocated as soon as char variable in declared. Now, the int variable fits in and so totally 5 out of 8 bytes have been filled. The float variable cannot be accomodated in this remaining first block as only 3 bytes are remaining(since float also takes 4 bytes). So, these 3 bytes in the first block are padded(as per your information). For the float variable, another 8 block memory is allocated and only 4 of them ll be occupied. So finally, the total size should be shown as 16 bytes (even though only 12 was occupied), but it shows the value as 12 bytes only.
Could you please clarify me on the same.
I got this doubt because, assume a scenario where you have declared only an char and an int. Now, if you c the total size of the object/class it shows as 8 bytes rather than showing as 5. So, from this I concluded that even the unallocated blocks ll be accounted by the sizeof operator. what us ur opinion on this??
|
|
|
|
|
if only 3 variables declared ( char, int and float), the structure will be aligned as 4 bytes, not 8 bytes.
so the size should be 12
|
|
|
|
|
does the memory blocks allocated 4 bytes/8 bytes depend on the number of variables also??
Could you please clarify me on this.
thanks
|
|
|
|
|
no, only on the size of the variable type;
short will start allocation on 2 bytes, int/float on 4 bytes and so on
codito ergo sum
|
|
|
|
|
Thanks.
So among the variables declared which ever is of max. storage will be considered. Am I right???
In case of char,int and float -> int/float will be considered
In case of int, float and double -> double will be considered
right??
Correct me if I am wrong please.
Regards
|
|
|
|
|
Correct,
But this default behaviour can be overruled by compiler options. ( /Zp[number] )
or with #pragma directives ( #pragma pack... )
codito ergo sum
|
|
|
|
|
Thanks for your information.
|
|
|
|
|
BadKarma wrote: But this default behaviour can be overruled by compiler options. ( /Zp[number] )
or with #pragma directives ( #pragma pack... )
But this default behaviour can be overruled by compiler options. ( /Zp[number] )
or with #pragma directives ( #pragma pack... )
if i use any of above 2 options ,I have to set the size such that it should get same or greater than the largest(never less) member size.
never say die
|
|
|
|
|
sunit5 wrote: I have to set the size such that it should get same or greater than the largest(never less) member size
What do you mean, it all depends on how the structure need to be alligned.
If you don't use this compile option (set it to default), the allignment will be calculated
on the greatest type in the structure. Is this what you need ?.
For instance I needed to send binary data (all data is layed out in structures) to
another program this -embeded- program was written/compiled on 2 byte alignment
(meaning an int would allign on a 2 byte boundary) while my default allignment causes
an int to be alligned on a 4 byte boundary. I could set the compile option to allign on
2 byte, but -there is always a but - another embeded program used the 4 byte
allignment for its binary data. So I needed to implement both. I left my default alligment
on 4 bytes, and used #pragma pack to set the alligment to 2 bytes for a few structures.
codito ergo sum
|
|
|
|
|
Thanx for the explanation.Sorry for annoying u once again
if my int is of 4 byte but the alignment is set to 2 bytes.Then 2 operation will be required to fetch the int .
Am I right? pls rectify me
never say die
|
|
|
|
|
No, why do you want that the memory packing changes in function of the number of variables in the structure ?
|
|
|
|
|
Sorry for my late answer but I was in meeting.
So to answer your question, this is simple: as there is no variable after your last float, there is no need to padd the structure with empty bytes. Remember that this is done only to keep variable in a single block. Thus, there is no need to padd bytes after your last variable because there is nothing after it.
Hope this make things clear.
|
|
|
|
|
i have a CStringList instance and i dynamically create CString objects and add them to the CStringList Object , now here is my question:
when i want to destroy the CStringList object i first have to 'delete' all the CString objects thati have inserted dynamically!for this i need to get the pointer to the CString....but using the RemoveTail() of the CStringList object i am able to get back only the LPCTSTR of the CString objects ,SO HOW do i GET THE CSTRING object pointer from the CStringList to delete the dynamically created CString objects?????
-- modified at 2:34 Tuesday 14th February, 2006
|
|
|
|
|
If your aim is to delete elements in the CStringList one by one, why not you 'find' that particular element and then use 'RemoveAt' function?
|
|
|
|
|
that too returns LPCTSTR not CString*!
-- modified at 3:01 Tuesday 14th February, 2006
|
|
|
|
|
Same thing?????
I am not sure if I am right. Correct me if I am wrong. Just a suggestion from my side.
See, 'Find' method returns the position of a particular string value passed to it. Once you get the position you can use the same in 'RemoveAt' functions which returns a void.
Willn't this help you?
|
|
|
|
|
yes,but this returns teh LPCTSTR value not the pointer to the CString!
-- modified at 3:18 Tuesday 14th February, 2006
|
|
|
|
|
Sorry !!!
May I know which return value(LPCTSTR) are you talking about. Because none of the functions that I mentioned 'Find' and 'RemoveAt' returns LPCTSTR. So I am confused as what return value you are talking about.
|
|
|
|