c++如何引用结构体中定义的数组中的元素?

时间:2022-08-30 20:00:30
struct dc_msg {
char imei[IMEI_LEN+1];
char name[DTU_NAME+1];
unsigned char msg_type;
unsigned char reserved;
unsigned short msg_len;
unsigned char msg_body[MAX_MSG_LEN];
};
想调用 msg_body[MAX_MSG_LEN]中0-10,也就是前11个数组的元素,将他们的值从十进制转换成十六进制,将转换后的值付给新的a[11]。有些术语说的可能不够专业,新手,刚刚开始学习,请高手赐教!

14 个解决方案

#1


十进制和十六进制只是对人而言,其中的数据是一样的,不需要转换。比如你可以用%d或者是%x去打印,但是数值本身是同样的。

引用 楼主 yxxwgs 的回复:
struct dc_msg {
char imei[IMEI_LEN+1];
char name[DTU_NAME+1];
unsigned char msg_type;
unsigned char reserved;
unsigned short msg_len;
unsigned char msg_body[MAX_MSG_LEN];
};
想调用 msg_body[MAX_MSG_LEN]中0-10,也就是前11个数组的元素,将他们的值从十进制转换成十六进制,将转换后的值付给新的a[11]。有些术语说的可能不够专业,新手,刚刚开始学习,请高手赐教!

#2


dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

#3


引用 2 楼 starytx 的回复:
dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};

#4


引用 3 楼 yxxwgs 的回复:
Quote: 引用 2 楼 starytx 的回复:

dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};
数组不可以直接这样赋值,可以使用memcpy函数来完成。
memcpy(x.msg_body ,a ,sizeof(a));

#5


引用 4 楼 starytx 的回复:
Quote: 引用 3 楼 yxxwgs 的回复:

Quote: 引用 2 楼 starytx 的回复:

dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};
数组不可以直接这样赋值,可以使用memcpy函数来完成。
memcpy(x.msg_body ,a ,sizeof(a));

就是memcpy(a ,x.msg_body ,11);

#6


星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?

#7


引用 6 楼 yxxwgs 的回复:
星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?
多少进制只是一种表现形式,对于计算机来说数值是没有变化的,不需要转化

#8


建议使用二进制来,四位一取即可!

#9


引用 6 楼 yxxwgs 的回复:
星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!

#10


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!

问题是我不想打印出来,而是想把数据存入数据库中.用的是基于对话框的工程估计也不能用打印的方式检查数据输出是否正确了,单步调试看输出的结果吧

#11


TRACE和printf用法差不多,不过调试的时候才起作用。

#12


引用 11 楼 lm_whales 的回复:
TRACE和printf用法差不多,不过调试的时候才起作用。


引用 11 楼 lm_whales 的回复:
TRACE和printf用法差不多,不过调试的时候才起作用。

ctrl+F10 单步调试时不出现调试的箭头是工程设置有问题还是程序编写有问题呢?程序编译、执行、运行都是可以通过的

#13


推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#14


工程设置吧,Vc Debug 可以直接调试,release 需要调试数据库.Pdb

另外,debug ,和release 配置都是可以修改的,只有没有修改的才能,
按 Debug ,release 判断可不可以调试,应该如何调试,

真正能够修改他们的配置的都是大牛,修改后,这就没有标准了。

调试时,可以直接看到内容,不需要转换。
不然可以同TRACE跟踪,在IDE的输出窗口里显示,这比较方便程序,不停顿运行调试。
就是看编译出不出错的那个子窗口。
调试对话框一般是出错对话框。

很多是断言出错的,断言对话框 ,断言---英文 Assert ,Vc全大写。

如果出现断言错误,程序就不能直接运行了;
要点击 忽略[/bcolor]
或者
[color=#FF0000]重试

才能继续。
或者
中断按钮,直接退出调试。

ASSERT ,TRACE 是程序调试的利器,对应的C,C++标准库程序中的函数,是全小写的。

ctrl+F10 单步调试时不出现调试的箭头,多半没有对应的调试信息或者代码(可能没有源码信息)
一般调试,
先写ASSERT ,这个编写程序是就写。确定程序是否逻辑有问题,比如某数据 x,范围是[0,100] 
负数和比100大的数,就是错误的,这时 
ASSERT(x>= 0 && x<=100);就可以发现这方面的问题
必要时TRACE,如果怀疑某个数据,可能不对,TRACE 

程序编译后,要先跑一遍。
没问题也还要再检查一下。
有问题TRACE,F9,F10,F11 联合使用。

在IDE中调试的时候,可以用鼠标移到数据位置,查看数据。

异常问题,一般IDE不好调试,要捕捉才行,而且要在IDE之外调试。

调试利用了int 3 中断,异常也是一种中断,
或者说中断也是一种异常

异常处理程序---Vc 调试器赖以生存的工具,中抛出异常---连续的两个未处理异常---程序直接结束,所以异常要另外调试,有可能的要尽量捕捉。





 

#1


十进制和十六进制只是对人而言,其中的数据是一样的,不需要转换。比如你可以用%d或者是%x去打印,但是数值本身是同样的。

引用 楼主 yxxwgs 的回复:
struct dc_msg {
char imei[IMEI_LEN+1];
char name[DTU_NAME+1];
unsigned char msg_type;
unsigned char reserved;
unsigned short msg_len;
unsigned char msg_body[MAX_MSG_LEN];
};
想调用 msg_body[MAX_MSG_LEN]中0-10,也就是前11个数组的元素,将他们的值从十进制转换成十六进制,将转换后的值付给新的a[11]。有些术语说的可能不够专业,新手,刚刚开始学习,请高手赐教!

#2


dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

#3


引用 2 楼 starytx 的回复:
dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};

#4


引用 3 楼 yxxwgs 的回复:
Quote: 引用 2 楼 starytx 的回复:

dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};
数组不可以直接这样赋值,可以使用memcpy函数来完成。
memcpy(x.msg_body ,a ,sizeof(a));

#5


引用 4 楼 starytx 的回复:
Quote: 引用 3 楼 yxxwgs 的回复:

Quote: 引用 2 楼 starytx 的回复:

dc_msg x;
x.msg_body[0];
x.msg_body[1];....就这样引用

那能进行这样的赋值操作吗?
a[11]=
{x.msg_body[0],x.msg_body[0],x.msg_body[1],x.msg_body[2],x.msg_body[3],.........,x.msg_body[10]};
数组不可以直接这样赋值,可以使用memcpy函数来完成。
memcpy(x.msg_body ,a ,sizeof(a));

就是memcpy(a ,x.msg_body ,11);

#6


星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?

#7


引用 6 楼 yxxwgs 的回复:
星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?
多少进制只是一种表现形式,对于计算机来说数值是没有变化的,不需要转化

#8


建议使用二进制来,四位一取即可!

#9


引用 6 楼 yxxwgs 的回复:
星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!

#10


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!


引用 9 楼 max_min_ 的回复:
Quote: 引用 6 楼 yxxwgs 的回复:

星哥,那您说,我单步调试时msg_body[0]=235,实际我使用时想用它的十六进制的形式EB,我要进行进制转换吗,在memcpy前就转吗?怎么转呢?



printf("%x\n", msg_body[0]);
//直接打印就好,不需要拷贝转换什么的了!

问题是我不想打印出来,而是想把数据存入数据库中.用的是基于对话框的工程估计也不能用打印的方式检查数据输出是否正确了,单步调试看输出的结果吧

#11


TRACE和printf用法差不多,不过调试的时候才起作用。

#12


引用 11 楼 lm_whales 的回复:
TRACE和printf用法差不多,不过调试的时候才起作用。


引用 11 楼 lm_whales 的回复:
TRACE和printf用法差不多,不过调试的时候才起作用。

ctrl+F10 单步调试时不出现调试的箭头是工程设置有问题还是程序编写有问题呢?程序编译、执行、运行都是可以通过的

#13


推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#14


工程设置吧,Vc Debug 可以直接调试,release 需要调试数据库.Pdb

另外,debug ,和release 配置都是可以修改的,只有没有修改的才能,
按 Debug ,release 判断可不可以调试,应该如何调试,

真正能够修改他们的配置的都是大牛,修改后,这就没有标准了。

调试时,可以直接看到内容,不需要转换。
不然可以同TRACE跟踪,在IDE的输出窗口里显示,这比较方便程序,不停顿运行调试。
就是看编译出不出错的那个子窗口。
调试对话框一般是出错对话框。

很多是断言出错的,断言对话框 ,断言---英文 Assert ,Vc全大写。

如果出现断言错误,程序就不能直接运行了;
要点击 忽略[/bcolor]
或者
[color=#FF0000]重试

才能继续。
或者
中断按钮,直接退出调试。

ASSERT ,TRACE 是程序调试的利器,对应的C,C++标准库程序中的函数,是全小写的。

ctrl+F10 单步调试时不出现调试的箭头,多半没有对应的调试信息或者代码(可能没有源码信息)
一般调试,
先写ASSERT ,这个编写程序是就写。确定程序是否逻辑有问题,比如某数据 x,范围是[0,100] 
负数和比100大的数,就是错误的,这时 
ASSERT(x>= 0 && x<=100);就可以发现这方面的问题
必要时TRACE,如果怀疑某个数据,可能不对,TRACE 

程序编译后,要先跑一遍。
没问题也还要再检查一下。
有问题TRACE,F9,F10,F11 联合使用。

在IDE中调试的时候,可以用鼠标移到数据位置,查看数据。

异常问题,一般IDE不好调试,要捕捉才行,而且要在IDE之外调试。

调试利用了int 3 中断,异常也是一种中断,
或者说中断也是一种异常

异常处理程序---Vc 调试器赖以生存的工具,中抛出异常---连续的两个未处理异常---程序直接结束,所以异常要另外调试,有可能的要尽量捕捉。