-
2020-04-20 22:05:22
foreach (FieldInfo field in typeof(Cpicturexif.Metadata).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) //遍历结构体里面含结构体的所有成员及值,里面重点是metaTest = (Cpicturexif.MetadataDetail)field.GetValue(m);GetValue()是得到的结构体对象m里面嵌套结构体,@Jski17761263313 { foreach (FieldInfo field2 in typeof(Cpicturexif.MetadataDetail).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) { Cpicturexif.MetadataDetail metaTest = new Cpicturexif.MetadataDetail() ; metaTest = (Cpicturexif.MetadataDetail)field.GetValue(m); } }
更多相关内容 -
C语言-结构体成员遍历
2021-08-24 15:59:38C语言-结构体成员遍历 此方法试用的前提:结构体成员的数据类型相同 。话不多说,直接上手。 “结构体成员遍历”进阶版:当结构体里的成员数据类型不一样,可以计算出每个结构体成员的偏移量,并将偏移量放到一个...C语言-结构体成员遍历
大家好,我是鸟哥
此方法试用的前提:结构体成员的数据类型相同 。话不多说,直接上手。
“结构体成员遍历”进阶版:当结构体里的成员数据类型不一样,可以计算出每个结构体成员的偏移量,并将偏移量放到一个数组中,遍历数组获取偏移量后再根据偏移去获取成员变量。这样取出了不同类型的结构体,直接进行赋值取值即可。进阶版的详细实现方法会在后期的另一篇文章中说明。
问题:
假设现在有一个结构体,成员都是int类型,现在需要对结构体的成员进行赋值或者取值。
将数值1-10分别赋给结构体成员Member_0到Member_9。typedef struct { int Member_0; int Member_1; int Member_2; int Member_3; int Member_4; int Member_5; int Member_6; int Member_7; int Member_8; int Member_9; }Member_t;
问题解决思路:
给结构体的成员赋值,最基本的方法就是结构体直接赋值,具体的几种实现方法如下。- 结构体初始化赋值
Member_t Member = { 1,2,3,4,5,6,7,8,9,10 }; //结构体初始化赋值
- 单一成员赋值
Member.Member_0 = 1; //结构体成员分别赋值 Member.Member_1 = 2; Member.Member_2 = 3; Member.Member_3 = 4; Member.Member_4 = 5; Member.Member_5 = 6; Member.Member_6 = 7; Member.Member_7 = 8; Member.Member_8 = 9; Member.Member_9 = 10;
上述两种方法适用于成员较少的结构体,当成员数量很多,并且需要统一赋值操作的时候,这两种方法就显得十分繁琐,低效。
为了让编写程序更加高效,让代码篇幅更少,可扩展性强,笔者总结了几种利用指针对结构体成员统一赋值的方法。具体实现如下:
Member_t Member; //结构体命名 Member_t* P_Member = &Member; //指向结构体的指针 int* P = (int*)P_Member; //结构体指针强制转换为int类型 int i; for (i = 0; i < sizeof(Member) / sizeof(int); i++) { (*P++) = i + 1; }
我们可以定义一个int类型的指针,指针类型与结构体的成员类型保持一致,再通过强制类型转换,将结构体指针类型强制转换为int类型的指针,把指针P指向结构体指针。
注:不能直接把int类型的指针指向结构体或者结构体指针。这样的话,程序就会报错。因为结构体名字是经过typedef后的类型,而P指针是int类型,两者类型不一样,无法通过编译器的类型检查,程序会直接报错,所以不能直接将P指向结构体或者结构体指针。
int* P = &Member; //这是错误的指针访问
上述强制转化结构体指针类型的方法可以实现结构体成员的统一赋值,但是这种方法很危险,因为它避开了编译器的类型检查。
利用指针遍历结构体成员最正确安全的方法就是使用&操作符取得一个指向结构体内部int类型成员的指针P_Member->Member_0。具体实现如下:
Member_t Member; //结构体命名 Member_t* P_Member = &Member; //指向结构体的指针 int i, * P; P = &P_Member->Member_0; //int类型的指针P指向结构体的第一个成员 for (i = 0; i < sizeof(Member) / sizeof(int); i++) { (*P++) = i + 1; }
结构体成员遍历输出结果:
我的微信公众号(ID:00后开发者)从00后的角度出发,专注但不局限于分享电气、嵌入式、机器视觉以及芯片行业的算法、技术文章和最新资讯。如果想查看更多内容,可以关注我的微信公众号。 -
结构体中含有结构体成员变量
2022-05-23 12:59:21结构体成员变量、结构体包含结构体1. 结构体成员变量介绍
在C语言中经常出现结构体作为结构体的成员变量的情况,如链表
1.1 结构体成员变量的形式
结构体作为成员变量有时可能是在其他文件中进行了声明,这里简单的以在同一个文件中表示进行介绍。
3 struct score 4 { 5 float math; 6 float chinese; 7 float englise; 8 float physical; 9 }; 10 11 typedef struct score SCORE; 12 13 struct node 14 { 15 SCORE data; 16 int id; 17 char* name; 18 }; 19 20 typedef struct node lnode;
如上面的代码所示,在结构体node中score结构体作为成员变量,这种形式有比较清晰的层次关系。
1.2 结构体中含结构体变量的优缺点
优点:从上面的1.1节代码中可以看到,将所有分数相关的成员放入一个结构体中,然后将这个结构体又作为一个成员变量放入另一个结构体中。这中方式可以使得结构层次清晰明朗,同一类的信息放入一个结构体,在使用时比较清晰。
缺点:需要使用某个结构体中的成员变量时需要多级包含2. 结构体成员变量赋值
2.1直接赋值
直接赋值也有两种方式,一种是直接在定义时就赋值,把结构体当做一个整体进行赋值
lnode ln2 = {{1002,"wujing",78,98},88,NULL};
另一种是先定义里面的结构体,然后将其当做一个成员进行赋值
ST s1 = {1001,"wangj",98,82}; lnode ln1; ln1.data = s1; ln1.english = 92; ln1.next = NULL;
2.2通过指针赋值
通过结构体指针间接的对结构体中每个成员进行赋值,结构体变量做为一个成员变量可以整体赋值,也可以对结构体内部的变量单独赋值。
lnode ln3; lnode* p = NULL; p = &ln3; p->english = 66; p->data.id = 1003; p->data.name = "Lihai"; p->data.math = 76; p->data.chinese = 86; p->next = NULL;
3. 示例代码
1 #include <stdio.h> 2 3 struct student 4 { 5 int id; 6 char* name; 7 int math; 8 int chinese; 9 }; 10 11 typedef struct student ST; 12 13 struct node 14 { 15 ST data; 16 int english; 17 struct node* next; 18 }; 19 20 typedef struct node lnode; 21 22 int main() 23 { 24 lnode ln2 = {{1002,"wujing",78,98},88,NULL}; 25 printf("ln2.data.id = %d, ln2.data.name = %s, ln2.data.math = %d, ln2.da ta.chinese = %d, ln2.english = %d, ln2.next = %#lx\n", ln2.data.id, ln2.data .name, ln2.data.math, ln2.data.chinese, ln2.english, ln2.next); 26 27 ST s1 = {1001,"wangj",98,82}; 28 lnode ln1; 29 ln1.data = s1; 30 ln1.english = 92; 31 ln1.next = NULL; 32 printf("ln1.data.id = %d, ln1.data.name = %s, ln1.data.math = %d,ln1.dat a.chinese = %d, ln1.english = %d, ln1.next = %#lx\n", ln1.data.id, ln1.data. name, ln1.data.math, ln1.data.chinese, ln1.english, ln1.next); 33 34 lnode ln3; 35 lnode* p = NULL; 36 p = &ln3; 37 p->english = 66; 38 p->data.id = 1003; 39 p->data.name = "Lihai"; 40 p->data.math = 76; 41 p->data.chinese = 86; 42 p->next = NULL; 43 printf("ln3.data.id = %d, ln3.data.name = %s, ln3.data.math = %d,ln3.dat a.chinese = %d, ln3.english = %d, ln3.next = %#lx\n", ln3.data.id, ln3.data. name, ln3.data.math, ln3.data.chinese, ln3.english, ln3.next); 44 }
-
结构体数组和结构体指针遍历
2020-12-11 21:44:19在工作过程中会遇到结构体,可能会忘记如何遍历结构体数组,这是一个简单的例子: void structArrayPtr() { // 定义一个结构体数组 struct Student studentArray[2] = { {"William", 18}, {"Mark", 20} }; ...在工作过程中会遇到结构体,可能会忘记如何遍历结构体数组,这是一个简单的例子:
void structArrayPtr() { // 定义一个结构体数组 struct Student studentArray[2] = { {"William", 18}, {"Mark", 20} }; // 如何遍历结构体数组 for( int i=0; i<2; i++ ) { cout << "name: " << studentArray[i].name << ", age: " << studentArray[i].age << endl; } cout << "***********************" << endl; // 定义一个结构体 struct Student student; student.name = "monkey"; student.age = 22; // 定义一个结构体指针 struct Student *stu_ptr = &student; // 利用->符去访问结构体成员 cout << "name: " << stu_ptr->name << ", age: " << stu_ptr->age << endl; cout << "***********************" << endl; // 定义新的结构体指针指向结构体数组 Student *stu_ptr1 = studentArray; // 利用结构体指针遍历结构体数组元素,依旧利用->符号去获取 for( int var=0; var<2; var++, stu_ptr1++ ) { cout << "name: " << stu_ptr1->name << ", age: " << stu_ptr1->age << endl; } }
-
Qt序列化基本类型结构体的简单方式
2022-03-03 23:40:15前提是结构体成员均为基本类型,也就是占用内存长度是确定的;还有不能为类,否则会导致memset初始化时操作了虚函数表的内存导致崩溃。 1.序列化的输入输出流的实现 typedef struct{ int a; char b; -
结构体的遍历
2019-04-07 09:56:30s_tToolConfig为结构体(类型:octet-string)(又称为uint8_t) static void tool_log(void *addr, uint8_t lenght) { uint8_t *adr =0; printf("\r\nread flash_tool: "); for(uint8_t ... -
QT中如何关联结构体中的各个变量
2018-11-06 19:48:49QT中如何关联结构体中的各个变量 日常查询一个结构体里面的变量,一般都是直接拿着结构体往控件填写相应的参数即可,但是实际应用中涉及到查询等操作时,需要根据某个名称获取其他的信息比如,它的相关说明等等。 ... -
Qt笔记8:如何遍历树形结构(选择遍历,节点选择效果)
2021-03-11 23:20:35我们在使用Qt的树控件QTreeWidget的时候,经常会遇到需要检查当前节点的选中状态; 一般一个节点有三个状态: A:当前节点以及所有子节点都被选中 B:当前节点以及所有子节点都未被选中 C:当前节点的子节点有被选中的... -
Qt - 类的成员变量
2021-02-17 15:56:04在查看qt的源码时候,qt使用了代理的方式,将数据单独抽象成一个Class##Private 类,所有的成员变量的都是由这个类来完成的。 例如:QThread 类,可以看到从表面上没有看到任何成员变量,那我们就来看看qt是如何... -
Qt:QMetaObject结构体
2021-04-10 21:43:49QMetaObject类包含有关Qt对象的元信息。 头文件: #include <QMetaObject> cmake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) qmake: QT += core ... -
C++ 结构体专项
2021-07-19 17:28:14语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体名 变量名 = { 成员1值 , 成员2值…} 定义结构体时顺便创建变量 示例: //结构体定义 ... -
第七章 Qt对象模型与容器类——Qt
2022-01-07 13:15:57Qt使用 moc,为标准 C++ 增加了一些特性: ●一个强大的无缝对象通信机制————信号和槽(signals and slots); ●可查询和可设计的对象属性系统(object properties); ●强大的事件和事件过滤器(events and ... -
打印结构体
2018-09-14 17:40:51某晚,log,需打印一个结构体,很烦,vim的tab不停的选择成员变量,android下又只能用%来定义输出格式 snippet asp #include <string> #include <sstream> inline void args_string... -
浅析Qt中的反射编程
2022-01-25 14:08:18所谓反射,就是指对象成员之间的自我检查。 使用反射编程就可以编写出通用的操作,就能对具有各种不同结构的类进行操作 二、元对象模式 我们知道要想实现Qt的信号和槽功能,我们就必须有Qt的元对象系统,因为这个... -
Qt源码解析-QFileSystemWatcher源码剖析(Linux).md
2020-09-19 19:31:01欢迎关注我的公众号:Qt那些事儿 简介 QFileSystemWatcher的作用是监视本地文件夹的变化以及文件的变化。 概述 QFileSystemWatcher的实现类是QFileSystemWatcherPrivate。 其中QFileSystemWatcherPrivate中的关键... -
Hello Qt(五十六)———QT5解析Json文件
2022-02-27 23:31:32一、QT5 Json简介 QT4中使用第三方库QJson解析JSON文件。 QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中。QT5新增加六个相关类: QJsonArray 封装 JSON 数组 ... -
QT核心机制2:属性系统
2022-05-29 01:45:35个人博客原文地址:QT核心机制2:属性系统 写在前面 这篇文章基本是对Qt官方文档某些章节的翻译理解了,翻译这些章节的原因是我认为这些是Qt中最核心的东西,翻译的过程也就是强迫自己认真去读它们的过程,我不会... -
【精华】详解Qt中的内存管理机制
2021-08-16 19:55:20Qt为软件开发人员提供了一套内存管理机制,用以替代手动内存管理。 下面开始逐条讲述Qt中的内存管理机制。 一脉相承的栈与堆的内存管理 了解C语言的同学都知道,C语言中的内存分配有两种形式:栈内存、堆内存。 栈... -
qt - QMetaObject
2021-01-24 21:57:38QMetaObject qt 官方说明 ...The QtMeta-Object Systemin Qt is responsible for the signals and slots inter-object communication mechanism, runtime type information, and the Qt property system. ... -
Qt反射
2018-03-02 10:28:09文章概览Qt反射内幕小窥详细内容反射前期准备得到注册的类成员变量得到注册的类成员函数访问类成员属性(get,set)调用注册的函数反射应用总结Qt反射内幕小窥Qt反射机制是基于moc(meta object compiler)实现的,在... -
QT类模板和类模板的特化
2020-05-26 23:43:43//当结构体为 struct FireData { QString type; struct Group { int no; QString a; QString b; QString c; }; QList<Group> groups; }; class MyData { public: MyData() {} ~MyData() {} ... -
C/C++ Qt TreeWidget 嵌套节点操作技巧
2022-05-24 06:41:58在上一篇博文《C/C++ Qt TreeWidget 单层树形组件应用》中给大家演示了如何使用TreeWidget组件创建单层树形结构,并给这个树形组件增加了右键菜单功能,接下来将继续延申树形组件的使用,并实现对树形框多节点的各种... -
C++面试题-----Qt篇
2022-05-12 11:13:32C++面试题-----Qt基础知识Qt信号与槽Qt信号与槽的优势和不足自定义信号槽注意事项:信号槽的多种用法:TCP/UDP描述Qt下Tcp通信的整个流程描述QT下udp通信的整个流程多线程描述QT下多线程的两种使用方法, 以及注意... -
Day2 QT常用基础类型(自用)
2022-05-15 09:30:06因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型。 QT基本数据类型定义在#include <QtGlobal> 中,QT... -
Qt --- 基本类
2022-03-03 08:06:31因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型(大部分是c++数据类型的别名), 下面给大家介绍一下这些基础的数类型 QT基本数据类型定义在#... -
Qt: 信号与槽机制
2022-04-27 22:25:481 Qt信号槽机制:是Qt的核心机制,它是Qt定义的一种对象间的通讯机制,且独立于标准C/C++语言。 2 信号(signals):当某个类对象发生内部改变时,发射“信号”随后与关联的“槽函数”被立即执行,“信号槽机制”... -
QT中Json的使用方法(类和json字符串相互转换的方法)
2022-05-19 19:44:52在QT5.0版本以后支持对Json的使用,直接使用QT提供的json类进行数据的组织和解析。 Json类 介绍 QJsonDoucument 它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二... -
Qt QVariant详细用法
2020-11-24 11:03:13QVariant可以存储各种数据类型,QVariant行为类似于C/C++的union, 但在Qt中比union强大很多, QVariant内置支持所有QMetaType::Type里声明的类型如:int,QString,QFont,QColor等,甚至QList,QMap<QString, ... -
01、Qt中的基础类(上)
2021-10-14 22:20:48因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型。 QT基本数据类型定义在#include <QtGlobal> 中,QT... -
QList 列表指针的 释放
2019-03-26 14:45:322.通过遍历列表对列表一个一个的释放。 在释放指针的同时把值清空,赋值为BULL 避免野指针。 QList*> *qList = new QList*> 动态分配内存空间 不使用时需要释放 T *t = new T; qList->append(t); ...