Здравствуйте, Andrew S, Вы писали:
AS>Все в куче, уж не обессудьте.
AS>AS>#define FLATTEN_STR(buff, name, idx) \
AS> (buff)[4*(idx)] = (TCHAR)((name##idx & 0xFF000000) >> 24);\
AS> (buff)[4*(idx) + 1] = (TCHAR)((name##idx & 0xFF0000) >> 16);\
AS> (buff)[4*(idx) + 2] = (TCHAR)((name##idx & 0xFF00) >> 8);\
AS> (buff)[4*(idx) + 3] = (TCHAR)(name##idx & 0xFF);
AS>void FlattenStr(LPSTR szBuffer, DWORD n0, DWORD n1, DWORD n2, DWORD n3, DWORD n4, DWORD n5, DWORD n6, DWORD n7)
AS>{
AS> FLATTEN_STR(szBuffer, n, 0);
AS> FLATTEN_STR(szBuffer, n, 1);
AS> FLATTEN_STR(szBuffer, n, 2);
AS> FLATTEN_STR(szBuffer, n, 3);
AS> FLATTEN_STR(szBuffer, n, 4);
AS> FLATTEN_STR(szBuffer, n, 5);
AS> FLATTEN_STR(szBuffer, n, 6);
AS> FLATTEN_STR(szBuffer, n, 7);
AS> szBuffer[64] = _T('\0');
AS>}
AS>template <DWORD n0 = 0, DWORD n1 = 0, DWORD n2 = 0, DWORD n3 = 0, DWORD n4 = 0, DWORD n5 = 0, DWORD n6 = 0, DWORD n7 = 0>
AS>struct CNameId
AS>{
AS> enum {name_size = 65, m_n0 = n0, m_n1 = n1, m_n2 = n2, m_n3 = n3, m_n4 = n4, m_n5 = n5, m_n6 = n6, m_n7 = n7};
AS> static void MakeStr(LPTSTR szBuffer)
AS> {
AS> FlattenStr(szBuffer, n0,n1,n2,n3,n4,n5,n6,n7);
AS> }
AS>};
Это можно переделать так :
void FlattenStr(LPSTR szBuffer, const DWORD* pN, DWORD n)
{
for(DWORD i=0;i<n;i++)
{
szBuffer[i*4+0]=HIBYTE(HIWORD(pN[i]));
szBuffer[i*4+1]=LOBYTE(HIWORD(pN[i]));
szBuffer[i*4+2]=HIBYTE(LOWORD(pN[i]));
szBuffer[i*4+3]=LOBYTE(LOWORD(pN[i]));
}
szBuffer[i*4] = 0;
}
template<DWORD n0 = 0,
DWORD n1 = 0,
DWORD n2 = 0,
DWORD n3 = 0,
DWORD n4 = 0,
DWORD n5 = 0,
DWORD n6 = 0,
DWORD n7 = 0>
struct CNameId
{
enum
{
name_size = 65,
m_n0 = n0,
m_n1 = n1,
m_n2 = n2,
m_n3 = n3,
m_n4 = n4,
m_n5 = n5,
m_n6 = n6,
m_n7 = n7
};
static void MakeStr(LPTSTR szBuffer)
{
static const DWORD a[]={n0,n1,n2,n3,n4,n5,n6,n7};
FlattenStr(szBuffer, a, 7);
}
};
Таким образом в случае изменения CNameId функцию FlattenStr не будет необходимости менять.