memcpy()将多个buffer顺序存至一块内存遇到的问题

C_Gui 2013-10-10 09:09:38
目前想法中的代码如下,线程中顺序采入大小为lDatalen的pBuffer。
将20次的数据按顺序存入m_pPackBuffer后,PostMessage一次,再从头循环。
现在的问题是Post过去的实际效果只有第一包的位置有数据,怀疑是存储指针的处理上出了问题,C++新手求指点……
			if (nPacketCount < 20)
{
memcpy(m_pPackBuffer, pBuffer, lDataLen);
*m_pPackBuffer = *m_pPackBuffer + lDataLen;
nPacketCount ++ ;//分包计数
}

if (nPacketCount = 20)
{
if (m_hParentHwnd)
{
::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)m_lDataLen, (LPARAM)m_pPackBuffer);
}
memset(m_pPackBuffer, 0, 10240);
*m_pPackBuffer = *m_pPackBuffer - m_lDataLen;
memcpy(m_pPackBuffer, pBuffer, lDataLen);
nPacketCount = 1;
}
...全文
381 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-10-10
  • 打赏
  • 举报
回复
引用 5 楼 u012241033 的回复:
[quote=引用 4 楼 mujiok2003 的回复:] 记得检查start + offset < 10240
感谢您能提供宝贵的代码!谢谢您else if的提示! 数据已经可以整包送上去了! 因为下位机发的包大小确定,如果我把代码写成下面这样,是否可以不用检查溢出了呢? [/quote] m_pPackBuffer[start + offset]不能越界,因为start+offset在递增。
C_Gui 2013-10-10
  • 打赏
  • 举报
回复
引用 4 楼 mujiok2003 的回复:
记得检查start + offset < 10240
感谢您能提供宝贵的代码!谢谢您else if的提示! 数据已经可以整包送上去了! 因为下位机发的包大小确定,如果我把代码写成下面这样,是否可以不用检查溢出了呢?
			if (nPacketCount < 20)
			{
				m_pPackBuffer[start + offset] = pBuffer;
				offset = offset + 512;
				nPacketCount ++ ;//分包计数
			}
			//if (nPacketCount = 20)
			else if (nPacketCount = 20)
			{
				if (m_hParentHwnd)
				{
					::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]);
				}
				start = 0;
				offset = 0;
				m_pPackBuffer[start + offset] = pBuffer;
				offset = offset + 512;
				nPacketCount = 1;
			}
mujiok2003 2013-10-10
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
LONG lBufferSize = pDevice->m_nInBufferSize;
UCHAR* pBuffer = new UCHAR[lBufferSize];
memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组
LONG lDataLen = lBufferSize;
UCHAR* m_pPackBuffer[10240];
static long start = 0;
static long offset = 0;


if (nPacketCount < 20)
{
	m_pPackBuffer[start + offset] = pBuffer;
	++offset;
	nPacketCount ++ ;//分包计数
}
//if (nPacketCount = 20)
else if (nPacketCount = 20)
{
	if (m_hParentHwnd)
	{
		::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]);
	}
	start = offset;
	offset = 0;
	m_pPackBuffer[start + offset] = pBuffer;
	++offset;
	nPacketCount = 1;
}
记得检查start + offset < 10240
mujiok2003 2013-10-10
  • 打赏
  • 举报
回复
LONG lBufferSize = pDevice->m_nInBufferSize;
UCHAR* pBuffer = new UCHAR[lBufferSize];
memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组
LONG lDataLen = lBufferSize;
UCHAR* m_pPackBuffer[10240];
static long start = 0;
static long offset = 0;


if (nPacketCount < 20)
{
	m_pPackBuffer[start + offset] = pBuffer;
	++offset;
	nPacketCount ++ ;//分包计数
}
//if (nPacketCount = 20)
else if (nPacketCount = 20)
{
	if (m_hParentHwnd)
	{
		::PostMessage(m_hParentHwnd, WM_SHOW_IMG, (WPARAM)offset, (LPARAM)m_pPackBuffer[start]);
	}
	start = offset;
	offset = 0;
	m_pPackBuffer[start + offset] = pBuffer;
	++offset;
	nPacketCount = 1;
}
C_Gui 2013-10-10
  • 打赏
  • 举报
回复
引用 1 楼 zhuben775 的回复:
*m_pPackBuffer = *m_pPackBuffer + lDataLen; 你这是啥啊?应该是 m_pPackBuffer = m_pPackBuffer + lDataLen; 不过注意保存原始指针 另外 PostMessage不是阻塞函数,你后面紧接着就清空指针,很危险,应该用sendmessage
谢谢您的指点!但是在我的定义中
LONG lBufferSize = pDevice->m_nInBufferSize;
	UCHAR* pBuffer = new UCHAR[lBufferSize];
	memset(pBuffer, 0, lBufferSize*sizeof(UCHAR));//初始化数组
	LONG lDataLen = lBufferSize;
	UCHAR* m_pPackBuffer[10240];
如果改成您说的那样,会提示error C2440: '=' : cannot convert from 'UCHAR **' to 'UCHAR *[10240]'
zhuben775 2013-10-10
  • 打赏
  • 举报
回复
*m_pPackBuffer = *m_pPackBuffer + lDataLen; 你这是啥啊?应该是 m_pPackBuffer = m_pPackBuffer + lDataLen; 不过注意保存原始指针 另外 PostMessage不是阻塞函数,你后面紧接着就清空指针,很危险,应该用sendmessage
赵4老师 2013-10-10
  • 打赏
  • 举报
回复
请记住,凡是消息缓冲,必然会发生“饿死”或“撑死”两种异常。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧