|
Nope. It is actually correct, as far the 'Empty' struct is defined as the OP did, i.e. the one obtained with
ZeroMemory( &Mystruct, sizeof( MyStruct ));
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]
|
|
|
|
|
Well,
I've never known it to go wrong, BUT:
Padding bytes are technically 'Undefined', meaning that the underlying architecture can do with them what it wants.
e.g. We have a structure with a single char, followed by three packing bytes. The compiler is at liberty in the interest of optimisation to store the contents of the entire EAX reg to the single char, without clearing the three upper bytes first, thereby loading garbage into the three padding bytes.
I repeat the architecture is at liberty to do so, although in my experience MS compilers sofar apparently never play that dirty. It could become a portability issue though, both to future MS Compilers, or, if the code needs porting to another platform (Linux, Win64?).
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: Padding bytes are technically 'Undefined', meaning that the underlying architecture can do with them what it wants.
They're actually well defined if you initialize them like the OP did.
Given the padding issue you may choose one of the following conventions:
- Consider padding bytes as 'members' of your struct.
- Ignore padding bytes
If you follow consistently the convention choosen, then you won't have troubles (the OP implicitely chose convention 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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
ZeroMemory() will clear the entire structure including padding bytes so no problem.
|
|
|
|
|
yes but I understood the OP wanted to check whether a struct was at its all zero state, where checking all bytes if fine if and only if the hidden bytes got cleared at least once (e.g. with ZeroMemory).
|
|
|
|
|
Not sure if I understand you Luc, but if you use ZeroMemory() it will clear all bytes between start and end of the structure. If, at a later point in time, you do a search through those same bytes for a non-zero value it will tell you if any element of the structure is non-zero. If any padding byte is non-zero then you have an insidious bug in your code.
|
|
|
|
|
That is what I said, checking all for zero is fine provided you ever cleared all (as with ZeroMemory), and not otherwise.
|
|
|
|
|
Luc Pattyn wrote: That is what I said, checking all for zero is fine provided you ever cleared all (as with ZeroMemory)
That's what the OP said in his/her first message.
|
|
|
|
|
Why don't you provide a method? For instance
MyStruct
{
bool IsEmpty()
{
char * p = (char * ) this;
for (i=0; i<sizeof(*this); i++)
{
if ( p[i] ) return false;
}
return true;
}
}
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]
|
|
|
|
|
Thanks friend, it worked well
-kk.tvm-
|
|
|
|
|
Hi All,
Is it possible to use named pipes cross domains?
~ Vikram S
|
|
|
|
|
Hi all
I have make connection through ODBC connection .Connection establish successful.Now i want to retrieve table name from database.
_RecordsetPtr rs;
_bstr_t bt;
HRESULT hr;
CString str;
bt=(_bstr_t)"select * from master.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
try
{
hr=rs.CreateInstance (__uuidof(Recordset));
ASSERT(SUCCEEDED(hr));
hr1=rs1->Open (bt,cn.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);
ASSERT(SUCCEEDED(hr));
rs1->MoveFirst();
while(!rs1->EndOfFile)
{
str1=(char*)(_bstr_t)rs->Fields->GetItem("tablename")->Value;
m_database.AddString(str1);
rs->MoveNext();
}
rs->Close();
}
catch(_com_error pCE)
{
CString str;
str.Format(_T("\n%s Error: %ld\r\n%s\r\n%s\r\n"),
(TCHAR*)pCE.Source(),
pCE.Error(),
(TCHAR*)pCE.Description(),
(TCHAR*)pCE.ErrorMessage());
MessageBox(str,"Message");
return ;
}
Error show
Microsoft OLEDB Provider for SQL Server Error:-2147217900
Plz help me
modified on Monday, December 28, 2009 4:44 AM
|
|
|
|
|
I am using MFC 9.0 to create Aero Wizard on Vista.
Evrything seems to be OK : creating a prpertysheet, setting the PSH_AEROWIZARD, adding propertypages, etc.
However the next and back buttons only work when the following functions of the currently active page are returning the zero value :
LRESULT OnWizardNext();
LRESULT OnWizardBack();
When the return value is zero, the framework uses the order by which the developer called CPropertySheet::AddPage for each page instance as an information rules for navigation.
However, the developer is allowed, according to the application logic, to override those function and return the dialog resource ID of specific page. That case, the framework navigates to this latter one instead of the default page.
example :
LRESULT CPage1::OnWizardNext()
{
return CPage3::IDD;
}
When the PSH_AEROWIZARD flag is set, unfortunately, this is not accepted : the next and back button do not work.
What's going on ? Is this a bug ?
In this case, is there a way how I can intercept the next and back clicks so I can make explicit calls to CPropertySheet::SetActivePage ?
Thank you in advance.
Easy Profiler : Now open source !
http://www.codeproject.com/KB/cpp/easyprofiler.aspx
|
|
|
|
|
MFC 9.0 assumes that the Parent() of the CPropertyPage is the CPropertySheet. With the Aero Wizards, that's not the case, there are two other HWNDs in between. Therefore, the code in CPropertyPage::MapWizardResult() that tries to find the CPropertySheet to do the conversion from resource ID to PROPSHEETPAGE_RESOURCE doesn't run. You will need to do the conversion yourself.
|
|
|
|
|
What is the basic function of #pragma prerpocessor directives is C?
|
|
|
|
|
From MSDN:
The #pragma directives offer a way for each compiler to offer machine- and operating system-specific features while retaining overall compatibility with the C and C++ languages. Pragmas are machine- or operating system-specific by definition, and are usually different for every compiler.
You can read more about Pragma directives here[^]
Regards
modified on Monday, December 28, 2009 1:26 PM
|
|
|
|
|
They can be used for things like making sure you include a header once:
#pragma once
disabling a warning:
#pragma warning(disable:4996)
adding a lib file to linker:
#pragma comment(lib, "winmm.lib")
and various other things.
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
Blaise Pascal
|
|
|
|
|
See here[^] for descriptions of the different #pragma types.
|
|
|
|
|
A pragma is an instruction to the compiler, and sets compiler behaviour, such as Code generation, How to behave when a warning or error condition is encountered, etc, etc.
It can cover any aspect of the compiler that the compiler writers deemed worth covering. The only rule about pragma's and portibility is, that a compiler should ignore any pragma that it does not understand.
Bram van Kampen
|
|
|
|
|
????
Is this a Bug in CP?
I never wrote the above though my name is on it, the answer I did write appears to have disappeared in the ether.
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: Is this a Bug in CP?
Probably. I've already reported the issue.
Regards,
Nuri Ismail
|
|
|
|
|
Thanks,
Seems to have Rectified.
Bram van Kampen
|
|
|
|
|
Im using the following code n my program,
CString sAlrm = _T("");
sAlrm.Format("%-16s %-10s %-10s",pTagBase->GetTagName(),pTagBase->GetDescription(),pAlrmDisp->sStatus);
But it shows error as
error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [18]' to 'const wchar_t *'
with
[
BaseType=wchar_t,
StringTraits=StrTraitMFC_DLL<wchar_t>
]
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
The return value of GetTagName,GetDescription all are CString value.
What is the error?how can i avoid it.
Im using VS2008.
Anu
|
|
|
|
|
It would appear that you're compiling with the Unicode character set selected. (Right click on the project in the Solution Explorer, select Properties; it's on the 'Configuration Properties/General' page.)
Your format string is being seen as a string of type char ; to convert it to TCHAR 's, which will automatically map to wchar_t 's when Unicode is selected, use the '_T' macro, just as you did when you initialized the string -
CString sAlrm = _T("");
sAlrm.Format(_T("%-16s %-10s %-10s"),pTagBase->GetTagName(),pTagBase->GetDescription(),pAlrmDisp->sStatus); .
L u n a t i c F r i n g e
|
|
|
|
|
Yes when i changed to UseMultiByte character set,i didnt get such kind of errors.
Thank you.
Anu
|
|
|
|