Click to See Complete Forum and Search --> : Pass CbyteArray to a function?


Electroskill
April 15th, 2003, 12:31 PM
Hello,

How do I pass the contents of this CbyteArray to this function? I have declared a CbyteArray in Visual C++ the following manner:

CByteArray indmessage;
indmessage.Add(0xf2);
indmessage.Add(i_enter_station);
indmessage.Add(0x00);
indmessage.Add(0x00);
indmessage.Add(0x01);
indmessage.Add(0x00);
indmessage.Add(0x02);
indmessage.Add(0x00);
indmessage.Add(0x03);
indmessage.Add(0x00);
int nnumberofbytes=indmessage.GetSize();
test_crc = calc_crc16(indmessage, 5);

I have a function (referred to in a header file) that consists of the following to compute a CRC-16:

#include "stdafx.h"
WORD calc_crc16(const BYTE* pBuffer, const int nLength)
{
static const WORD CRC16_TABLE[16] =
{
0x0000, 0xCC01, 0xD801, 0x1400,
0xF001, 0x3C00, 0x2800, 0xE401,
0xA001, 0x6C00, 0x7800, 0xB401,
0x5000, 0x9C01, 0x8801, 0x4400
};
register WORD wCrc = 0;
register WORD wTemp;
register int nIndex;
for(nIndex = 0; nIndex < nLength; nIndex++, pBuffer++)
{
/* lower 4 bits */
wTemp = CRC16_TABLE[wCrc & 0x000F];
wCrc = (wCrc >> 4) & 0x0FFF;
wCrc = wCrc ^ wTemp ^ CRC16_TABLE[*pBuffer & 0x000F];
/* upper 4 bits */
wTemp = CRC16_TABLE[wCrc & 0x000F];
wCrc = (wCrc >> 4) & 0x0FFF;
wCrc = wCrc ^ wTemp ^ CRC16_TABLE[(*pBuffer >> 4) & 0x000F];
}
return wCrc;
}

My question is: how do I pass the 10 bytes I added to my CbyteArray to the CRC-16 function so that the function can compute the CRC-16 value of all 10 bytes?

I attempted this:
WORD test_crc = calc_crc16(indmessage, nnumberofbytes);
But obviously, it didn’t work.
Thank you!

Electroskill

Graham
April 15th, 2003, 01:14 PM
It's pity you chose to use CByteArray. Use std::vector and the solution's simple:

std::vector<BYTE> indmessage;
indmessage.push_back(0xf2);
indmessage.push_back(i_enter_station);
indmessage.push_back(0x00);
indmessage.push_back(0x00);
indmessage.push_back(0x01);
indmessage.push_back(0x00);
indmessage.push_back(0x02);
indmessage.push_back(0x00);
indmessage.push_back(0x03);
indmessage.push_back(0x00);
int nnumberofbytes=indmessage.GetSize();
test_crc = calc_crc16(&indmessage[0], 5);

I can't answer for CByteArray, though - I try to steer clear of inferior classes.

Paul McKenzie
April 15th, 2003, 01:34 PM
Originally posted by Electroskill
My question is: how do I pass the 10 bytes I added to my CbyteArray to the CRC-16 function so that the function can compute the CRC-16 value of all 10 bytes?
Use the GetData() member function. It returns a pointer to the data. It is equivalent to Graham's answer of passing the address of the first element in a vector.

Also, CByteArray goes way back and should not be used in a C++ program in this day and age, not even in an MFC-based program. It has been superseded by the C++ standard classes (std::vector), and is even superseded by the MFC CArray<> template class.

Regards,

Paul McKenzie

mwilliamson
April 15th, 2003, 02:24 PM
test_crc = calc_crc16(indmessage, 5);

WORD calc_crc16(const BYTE* pBuffer, const int nLength);

looks like you have a bug there, since there are more than 5 elements in you indmessage array.

mwilliamson
April 15th, 2003, 02:25 PM
Originally posted by Paul McKenzie
It has been superseded by the C++ standard classes (std::vector), and is even superseded by the MFC CArray<> template class.


I thought CByteArray was just a typedef of CArray<BYTE> ?

Paul McKenzie
April 15th, 2003, 04:03 PM
Originally posted by mwilliamson


I thought CByteArray was just a typedef of CArray<BYTE> ? CByteArray goes back to the days of Visual C++ 1.0 when there were no templates, therefore it couldn't be a typedef for CArray<BYTE>.

Also, the CArray<> template takes two arguments.

Regards,

Paul McKenzie

galathaea
April 15th, 2003, 04:11 PM
If you look in afxcoll.h, you will notice that CByteArray is a fully defined class, not a typedef, with no generic components. The only advantage it might have over std::vector is serialization support, but I personally tend to avoid MFC serialization techniques (again very old; predate modern c++ RTTI -- which is still rather lacking -- and other advances which place limits on its use) over the more robust methods with better type safety and support for generic parameterization.

mwilliamson
April 15th, 2003, 05:22 PM
Originally posted by Paul McKenzie
Also, the CArray<> template takes two arguments.


From AfxTmpl.h
template<class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject


The second is optional.