0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于结构体变量建模的介绍和原理

MATLAB 来源:djl 2019-09-12 09:54 次阅读

鉴于有不少模型开发工程师缺乏 C 语言的基本概念,我这里大致说一下 C 代码中的结构体。

首先我们需要知道有结构体类型和结构体变量。

结构体类型在 C 语言中的定义如下:

struct mystruct_T

{

uint8 a;

int16 b;

uint16 c;

};

这里 mystruct_T 就是结构体类型。结构体类型是一种组合数据类型,不同于数组,结构体的元素是可以有不同数据类型的,上面的例子中 a、b、c 的数据类型各不相同。

我们可以像使用基本数据类型一样使用结构体类型去定义变量,使用结构体类型定义的变量是结构体变量,比如:

mystruct_T mystruct_var;

那么mystruct_var就是一个结构体变量,可以通过如下结构体变量右侧加点来访问结构体变量中的元素,比如:

mystruct_var.a = 30;

或者:

tmp = mystruct_var.c;

这样,我们就有了结构体类型 mystruct_T 和结构体变量 mystruct_var。

我们做一个假设,如果上述结构体里面的元素 c 不是一个单个元素,而是一个结构体变量,情况将会怎么样?比如:

struct mystruct_T

{

uint8 a;

int16 b;

substruct_T c;

};

结构体里面还套着一个结构体,于是我们就有了结构体嵌套。

我们在 C 语言中定义变量的时候,可以定义单个变量,也可以定义一个数组,比如:

int8 x[10];

结构体类型同样也可以用于定义结构体数组,比如

mystruct_T mystruct_array[10]

这样,我们就有了结构体数组。

下面我们一起看看如何在模型里建模或者配置,让生成的 C 代码里出现结构体变量、结构体嵌套和结构体数组。

开始介绍之前,请大家记住两点:

C 代码中的结构体变量跟模型中的 Bus 信号相对应

C 代码中的结构体类型跟模型中的 Bus 对象相对应

一. 结构体变量的代码实现

有模型如下:

关于结构体变量建模的介绍和原理

数据字典中有 Bus对象 myBus 定义如下:

关于结构体变量建模的介绍和原理

将 Inport 端口的数据类型设置为 myBus,Inport 的外观发生变化,变成环形。为控制结构体变量的变量名如我们所期望,在信号线上设置信号名 x、y。然后在数据字典中分别定义信号对象 x、y。将 x、y 的数据类型设置为 myBus,如下图:

关于结构体变量建模的介绍和原理

当然,x、y 的存储类设置跟非结构体代码生成一样,这里分别设置为 ImportedExtern 和 ExportedGlobal。

除此之外,还需要把 BusCreator 的输出数据类型设置为 myBus,如果你没做这个设置, Embeded Coder 会提醒你设置。

做好上述设置,以及代码生成的基本设置之后,Build 模型,代码就有了,你会发现结构体类型 myBus 的定义如下:

typedef struct

{

real_T a;

real_T b;

real_T c;

} myBus;

变量 y 的定义如下:myBus y;

变量 x 的声明如下:extern myBus x;

二. 结构体嵌套的代码实现

在上述例子中的数据字典中再定义一个 Bus 对象 subBus,如下图:

关于结构体变量建模的介绍和原理

再将 myBus 中的元素 c 的数据类型改为 subBus,模型做相应的调整如下:

关于结构体变量建模的介绍和原理

Build 模型,代码中 myBus 的定义如下:

typedef struct

{

real_T a;

real_T b;

subBus c;

} myBus;

其中 subBus 定义如下:

typedef struct

{

real_T u;

real_T v;

} subBus;

数据字典中信号对象 x 和 y 的定义跟前面的例子一样,结构体变量 x 和 y 在代码中的定义也跟前面的例子一样,整个算法的实现函数如下:

void nestStructModel_step(void)

{

y.a = K * x.a;

y.b = K * x.b;

y.c.u = K *x.c.u;

y.c.v = K *x.c.v;

}

很显然,结构体嵌套,对应到模型中,就是 Bus 嵌套。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68330
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28328
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10833
收藏 人收藏

    评论

    相关推荐

    隧道BIM如何设计和建模

    、协作工作、优化设计,并最大程度地提高项目效率和质量。下面是关于如何设计和建模隧道BIM的详细内容: 1.数据采集与建模需求确定:在设计之初,需要收集并整合地形、地质、气象等方面的数据,并确定设计需求和目标。这些数据将为后续BI
    的头像 发表于 06-04 15:54 350次阅读

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构在内
    的头像 发表于 06-04 08:04 373次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    嵌入式中C语言结构基本实现

    :     在struct 中声明了一个含有若干新成员的数据类型。     tag  是结构标签。     member-list  是标准的变量定义,比如 int i; 或者 float f,或者其他
    的头像 发表于 05-11 08:49 934次阅读
    嵌入式中C语言<b class='flag-5'>结构</b><b class='flag-5'>体</b>基本实现

    求助,关于G031ADC结构设置的几个疑问求解

    本人在使用ADC时想使用多通道模式,所以便在CUBEMX上将十九个通道全部打开(包括三个内部通道),生成代码以后详细看了一下结构的配置发现有几个疑惑, 1.ADC通道分为规则通道和注入通道,那么
    发表于 03-15 07:03

    介绍三种建模方式

    据量大,而是指样本的完备性。还有就是大数据或者AI被专业学者或者行业工程师所诟病的就是,纯粹的数据驱动搞不出所以然出来,需要领域知识(即Domain Knowledge)的协助。此外,还有第三种建模方式就是混合驱动,即基础物理模型加上数据驱动的方式。下文详细介绍一下三种
    的头像 发表于 01-23 10:48 1543次阅读

    求助,请问一个结构如何全部定义到 __attribute__ 区域?

    请问一个结构如何全部定义到 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储到 __attribute__ 区域。 三个结构 ,每个
    发表于 01-16 07:29

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,结构
    的头像 发表于 01-11 18:24 1254次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    使用SEGGER Embedded Studio编译器发现变量无法自动初始化

    使用SEGGER Embedded Studio编译器发现变量无法自动初始化, 例如声明静态变量static uint8_t i = 0;这种写法i成了静态变量,但没有初始化成功,声明的结构
    发表于 01-11 14:21

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构可以
    的头像 发表于 01-11 08:00 934次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    keil arm工程中结构1字节对齐如何实现

    在Keil Arm工程中,结构的对齐方式可以通过使用特定的编译器指令或者关键字来实现。结构的对齐方式会直接影响结构
    的头像 发表于 01-05 14:40 3480次阅读

    ros怎么设置环境变量

    设置ROS环境变量是使用ROS的重要步骤之一。本文将详细介绍如何设置ROS环境变量,包括什么是环境变量、为什么要设置ROS环境变量、如何设置
    的头像 发表于 12-28 13:52 1949次阅读

    SaberRD状态机建模工具介绍(二)状态机建模工具使用示例

    假设电阻阻值为r_normal,首先打开状态机建模工具,添加电阻端口,电阻端口包含贯通变量电流和跨接变量电压,使用分支型端口。
    的头像 发表于 12-05 09:53 941次阅读
    SaberRD状态机<b class='flag-5'>建模</b>工具<b class='flag-5'>介绍</b>(二)状态机<b class='flag-5'>建模</b>工具使用示例

    cmd_tbl_t结构变量调用命令信息

    一个cmd_tbl_t结构变量包含了调用一条命令的所需要的信息。 • 对于环境变量bootcmd,执行run_command(bootcmd, flag)之后,最终是将bootcmd
    的头像 发表于 12-04 17:37 582次阅读
    cmd_tbl_t<b class='flag-5'>结构</b><b class='flag-5'>体</b><b class='flag-5'>变量</b>调用命令信息

    golang结构如何定义?如何使用呢?

    结构是go语言最重要的数据结构之一,go和其它编程语言不一样,它没有类的概念,类比过来struct就相当于其它语言中的类,因此十分重要。
    的头像 发表于 11-28 10:36 414次阅读

    golang结构实例代码

    结构是go语言最重要的数据结构之一,go和其它编程语言不一样,它没有类的概念,类比过来struct就相当于其它语言中的类,因此十分重要。
    的头像 发表于 11-28 10:35 421次阅读