公有成员变量为何在同一个类中不公有?

onlymay 2005-08-16 03:18:54
在player.h定义
public:
HANDLE m_hComm;

在player.cpp中有函数
int CPlayer::InitComm(int Comm_num, int baud)
从中获得了m_hComm(确定能正确)

然后再运行函数
BOOL CPlayer::WriteABuffer(char *lpBuf, DWORD dwToWrite)
中用到m_hComm时,如下:
if (!WriteFile(m_hComm, lpBuf, dwToWrite, &dwWritten, &osWrite))
为什么m_hComm还是NULL呢?(初始化时设m_hComm = NULL)
...全文
243 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
onlymay 2005-08-29
  • 打赏
  • 举报
回复
另外,如果我把m_player改成在对话框里定义
VideoNetDlg.h
{ Public:
CPlayer m_player;
}
然后调用语句改成
Dlg->m_player.InitComm(Comm,baud)和
Dlg->m_player.WriteABuffer(mesg,len)
m_hComm就会正确获得,所以我想不是调用顺序或值被改变的问题

谢谢!!!!
onlymay 2005-08-29
  • 打赏
  • 举报
回复

可是,由用户端传送到服务器端的数据type==TYPE_SERIAL和type==TYPE_TEXT是手工控制,我初始化后,立刻就执行了传输小车车速数据的命令,而且,我用搜索查询过,只有这我写出的函数包含有m_hComm这个变量

PS:m_hComm在WriteBuffer中依旧是NULL(初始化),而没有变成别的值
onlymay 2005-08-29
  • 打赏
  • 举报
回复
up
菜牛 2005-08-28
  • 打赏
  • 举报
回复
if (type==TYPE_SERIAL)
if(type==TYPE_TEXT)
这是两个不同的判断条件,InitComm和WriteABuffer不会同时执行,这个中间可能已经修改了m_hComm的值。
onlymay 2005-08-27
  • 打赏
  • 举报
回复
忘了说明
在player.h定义
public:
HANDLE m_hComm;
CPlayer m_player;
onlymay 2005-08-27
  • 打赏
  • 举报
回复
好的,只是比较长!
PS:这是服务器端程序!客户端程序将串口和小车控制传送到服务器端,请不要再怀疑顺序问题,因为在客户端程序中,串口数据和小车控制数据是由人手工输入并分别Press 不同的Button;而且设断点调试时,的确有数据传到并且值是正确的

谢谢!!!!!!

DSocket.cpp中:
// Invoked when any data arrives from the remote host
void CDSocket::OnReceive(int errcode)
{
//如果收到串口类型
if (type==TYPE_SERIAL)
{
retvalue=this->ReceiveFrom(data,length,address,port);

if(retvalue==SOCKET_ERROR)
return;
int Comm,baud;
Comm = data[1];
baud =data[2];
m_player.InitComm(Comm,baud) //串口初始化!!!!!!!!!!!!!
}

//接收小车时间,速度控制命令
if(type==TYPE_TEXT)
{
retvalue=this->ReceiveFrom(data,length,address,port);
if(retvalue==SOCKET_ERROR)
return;

// Get host name from the data.
// Length of username
n=data[1];

for(int i=0;i<n;i++)
hname[i]=data[i+2];
hname[i]=0;

len=data[n+2] | ( data[n+3]<<8 ); //len为data数组的长度
memcpy(mesg,&data[n+4],len); //mesg为所传信息的char指针
mesg[len]=0;

m_player.WriteABuffer(mesg,len) //写串口!!!!!!!!!!!!!
}


另在Player.cpp中
int CPlayer::InitComm(int Comm_num, int baud)
{
CString strCommNum;

if(1 == Comm_num)
strCommNum = "COM1";
else
strCommNum = "COM2";
if(1 == baud)
baud = 9600;
else
baud = 19200;

m_hComm = CreateFile( strCommNum,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0); //!!!产生m_hComm!!!!!!!!!
if (m_hComm == INVALID_HANDLE_VALUE)
{
AfxMessageBox("串口初始化失败");
return -1;
}// error opening port; abort

DCB dcb;

FillMemory(&dcb, sizeof(dcb), 0);
dcb.DCBlength = sizeof(dcb);

CString str;
CString str1;

str1.Format("%d", baud);
str = str1 + ",n,8,1";
BOOL b = BuildCommDCB(str, &dcb);

if (!b)
{
AfxMessageBox("buildcommdcb failed!");
return -1;
}

if(!SetCommState(m_hComm, &dcb))
{
AfxMessageBox("串口初始化失败!");
return -1;
}

return 1;
}

BOOL CPlayer::WriteABuffer(char *lpBuf, DWORD dwToWrite)
{
OVERLAPPED osWrite = {0};
DWORD dwWritten;
BOOL fRes;


// Create this writes OVERLAPPED structure hEvent.
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);// 第二个参数
if (osWrite.hEvent == NULL)
{
// Error creating overlapped event handle.
return FALSE;
}

// Issue write.
if(!WriteFile(m_hComm, lpBuf, dwToWrite, &dwWritten, &osWrite))//m_hComm不可取到值!!!!??
{
if (GetLastError() != ERROR_IO_PENDING)
{
// WriteFile failed, but it isn't delayed. Report error and abort.
fRes = FALSE;
}
else
{
// Write is pending.
if (!GetOverlappedResult(m_hComm, &osWrite, &dwWritten, TRUE))
{
fRes = FALSE;
//AfxMessageBox("fail2");
}
else
{
fRes = TRUE;
}
}
}
else
// WriteFile completed .
{
fRes = TRUE;
}

CloseHandle(osWrite.hEvent);
return fRes;
}
Atry 2005-08-26
  • 打赏
  • 举报
回复
把全部相关源代码贴上来吧
onlymay 2005-08-26
  • 打赏
  • 举报
回复
up
onlymay 2005-08-17
  • 打赏
  • 举报
回复
我再次确定,我用了F10一步步看着InitComm函数的进行,他的确是运行了,而且每次都运行,并且都得到有效m_hComm值。

另外,我也在构造函数里给m_hComm赋予初值NULL了

jiangdoudoux 2005-08-17
  • 打赏
  • 举报
回复
我看你的程序中调用函数InitComm是有条件的,那么,是否正好你那个种情况下并没有去调用该函数呢?另外你再修改一下构造函数,将m_hcomm赋一下初始值,然后再检查一下结果又是如何
if(...)
{
m_player.InitComm(Comm,baud);
}
gomoney 2005-08-17
  • 打赏
  • 举报
回复
我也碰到楼主类似问题
http://community.csdn.net/Expert/topic/4213/4213881.xml?temp=9.823024E-03
关注
onlymay 2005-08-17
  • 打赏
  • 举报
回复
请求各位帮助!!!!
onlymay 2005-08-16
  • 打赏
  • 举报
回复
在初始化InitComm函数里,m_hComm是有效值(用断点看过),而且无错误返回;
而InitComm之后,在WriteABuffer中,m_hComm为NULL(这是我在CPlayer::CPlayer()中赋的初值)

另外,我确定没有在别的过程中用到m_hComm值,我将m_player设在另一个类里来调用,却没有出错(如我上个帖子说的),这不是很奇怪吗?
onlymay 2005-08-16
  • 打赏
  • 举报
回复
在初始化InitComm函数里,m_hComm是有效值(用断点看过),而且无错误返回;
而InitComm之后,在WriteABuffer中,m_hComm为NULL(这是我在CPlayer::CPlayer()中赋的初值)

另外,我确定没有在别的过程中用到m_hComm值,我将m_player设在另一个类里来调用,却没有出错(如我上个帖子说的),这不是很奇怪吗?
manw 2005-08-16
  • 打赏
  • 举报
回复
1.检查是否正确初始化。
2.这个值有可能在另外的过程或引用时被改变。
ps:如果非要引用公用成员变量时,一般定义为常引用,以防引起意外改变其值
onlymay 2005-08-16
  • 打赏
  • 举报
回复
我调用了InitComm,也没有在别处对m_hComm操作,我把程序给完整些吧
主程序DSocket.cpp中(DSocket.h中,设CPlayer m_player)
.....
if(...)
{
m_player.InitComm(Comm,baud);
}

//获得mesg,len值
m_player.WriteABuffer(mesg,len);
.......


int CPlayer::InitComm(int Comm_num, int baud)
{
......
m_hComm = CreateFile( strCommNum,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
.......
}//用F5跟踪时确定能获得有效的值

BOOL CPlayer::WriteABuffer(char *lpBuf, DWORD dwToWrite)
{
.....
if (!WriteFile(m_hComm, lpBuf, dwToWrite, &dwWritten, &osWrite))
{....}
.....
}//在此函数中,m_hComm没有获得在InitComm中得到的值

另外,奇怪的是,当我把m_player设于VideoNetDlg.h中
主程序(DSocket.cpp)改成
pdlg->m_player.InitComm(Comm,baud)
和pdlg->m_player.WriteABuffer(mesg,len)时,却能够得到正确的答案

这两者有什么不同吗?
hejiwangbaggio 2005-08-16
  • 打赏
  • 举报
回复
你有可能在类外改变了他的值!
这就是成员变量做成共有的坏处
Cocoky 2005-08-16
  • 打赏
  • 举报
回复
g s
i_noname 2005-08-16
  • 打赏
  • 举报
回复
没看到你有地方改变了m_hComm的值,它当然一直是NULL啦
qiangorqiang 2005-08-16
  • 打赏
  • 举报
回复
是不是没有调用InitComm()

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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