鑒于有不少模型開發(fā)工程師缺乏 C 語言的基本概念,我這里大致說一下 C 代碼中的結(jié)構(gòu)體。
首先我們需要知道有結(jié)構(gòu)體類型和結(jié)構(gòu)體變量。
結(jié)構(gòu)體類型在 C 語言中的定義如下:
struct mystruct_T
{
uint8 a;
int16 b;
uint16 c;
};
這里 mystruct_T 就是結(jié)構(gòu)體類型。結(jié)構(gòu)體類型是一種組合數(shù)據(jù)類型,不同于數(shù)組,結(jié)構(gòu)體的元素是可以有不同數(shù)據(jù)類型的,上面的例子中 a、b、c 的數(shù)據(jù)類型各不相同。
我們可以像使用基本數(shù)據(jù)類型一樣使用結(jié)構(gòu)體類型去定義變量,使用結(jié)構(gòu)體類型定義的變量是結(jié)構(gòu)體變量,比如:
mystruct_T mystruct_var;
那么mystruct_var就是一個(gè)結(jié)構(gòu)體變量,可以通過如下結(jié)構(gòu)體變量右側(cè)加點(diǎn)來訪問結(jié)構(gòu)體變量中的元素,比如:
mystruct_var.a = 30;
或者:
tmp = mystruct_var.c;
這樣,我們就有了結(jié)構(gòu)體類型 mystruct_T 和結(jié)構(gòu)體變量 mystruct_var。
我們做一個(gè)假設(shè),如果上述結(jié)構(gòu)體里面的元素 c 不是一個(gè)單個(gè)元素,而是一個(gè)結(jié)構(gòu)體變量,情況將會(huì)怎么樣?比如:
struct mystruct_T
{
uint8 a;
int16 b;
substruct_T c;
};
結(jié)構(gòu)體里面還套著一個(gè)結(jié)構(gòu)體,于是我們就有了結(jié)構(gòu)體嵌套。
我們?cè)?C 語言中定義變量的時(shí)候,可以定義單個(gè)變量,也可以定義一個(gè)數(shù)組,比如:
int8 x[10];
結(jié)構(gòu)體類型同樣也可以用于定義結(jié)構(gòu)體數(shù)組,比如
mystruct_T mystruct_array[10]
這樣,我們就有了結(jié)構(gòu)體數(shù)組。
下面我們一起看看如何在模型里建?;蛘吲渲?,讓生成的 C 代碼里出現(xiàn)結(jié)構(gòu)體變量、結(jié)構(gòu)體嵌套和結(jié)構(gòu)體數(shù)組。
開始介紹之前,請(qǐng)大家記住兩點(diǎn):
C 代碼中的結(jié)構(gòu)體變量跟模型中的 Bus 信號(hào)相對(duì)應(yīng)
C 代碼中的結(jié)構(gòu)體類型跟模型中的 Bus 對(duì)象相對(duì)應(yīng)
一. 結(jié)構(gòu)體變量的代碼實(shí)現(xiàn)
有模型如下:

數(shù)據(jù)字典中有 Bus對(duì)象 myBus 定義如下:

將 Inport 端口的數(shù)據(jù)類型設(shè)置為 myBus,Inport 的外觀發(fā)生變化,變成環(huán)形。為控制結(jié)構(gòu)體變量的變量名如我們所期望,在信號(hào)線上設(shè)置信號(hào)名 x、y。然后在數(shù)據(jù)字典中分別定義信號(hào)對(duì)象 x、y。將 x、y 的數(shù)據(jù)類型設(shè)置為 myBus,如下圖:

當(dāng)然,x、y 的存儲(chǔ)類設(shè)置跟非結(jié)構(gòu)體代碼生成一樣,這里分別設(shè)置為 ImportedExtern 和 ExportedGlobal。
除此之外,還需要把 BusCreator 的輸出數(shù)據(jù)類型設(shè)置為 myBus,如果你沒做這個(gè)設(shè)置, Embeded Coder 會(huì)提醒你設(shè)置。
做好上述設(shè)置,以及代碼生成的基本設(shè)置之后,Build 模型,代碼就有了,你會(huì)發(fā)現(xiàn)結(jié)構(gòu)體類型 myBus 的定義如下:
typedef struct
{
real_T a;
real_T b;
real_T c;
} myBus;
變量 y 的定義如下:myBus y;
變量 x 的聲明如下:extern myBus x;
二. 結(jié)構(gòu)體嵌套的代碼實(shí)現(xiàn)
在上述例子中的數(shù)據(jù)字典中再定義一個(gè) Bus 對(duì)象 subBus,如下圖:

再將 myBus 中的元素 c 的數(shù)據(jù)類型改為 subBus,模型做相應(yīng)的調(diào)整如下:

Build 模型,代碼中 myBus 的定義如下:
typedef struct
{
real_T a;
real_T b;
subBus c;
} myBus;
其中 subBus 定義如下:
typedef struct
{
real_T u;
real_T v;
} subBus;
數(shù)據(jù)字典中信號(hào)對(duì)象 x 和 y 的定義跟前面的例子一樣,結(jié)構(gòu)體變量 x 和 y 在代碼中的定義也跟前面的例子一樣,整個(gè)算法的實(shí)現(xiàn)函數(shù)如下:
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;
}
很顯然,結(jié)構(gòu)體嵌套,對(duì)應(yīng)到模型中,就是 Bus 嵌套。
-
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73999 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29511 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11374
發(fā)布評(píng)論請(qǐng)先 登錄
10個(gè)例子代碼,C語言結(jié)構(gòu)體的高級(jí)
一個(gè)經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用的實(shí)例
結(jié)構(gòu)體聲明與定義
typedef結(jié)構(gòu)體使用
為什么不建議用匿名結(jié)構(gòu)體
使用typede的f優(yōu)勢(shì)介紹
常用變量的介紹
C語言結(jié)構(gòu)體使用
【產(chǎn)品介紹】Altair MotionView支持多體仿真與優(yōu)化軟件
定義IO初始化結(jié)構(gòu)體
TechWiz LCD 2D應(yīng)用:不同結(jié)構(gòu)下的VT曲線
滲壓計(jì)在混凝土結(jié)構(gòu)體中的安裝指南
關(guān)于結(jié)構(gòu)體變量建模的介紹和原理
評(píng)論