鑒于有不少模型開(kāi)發(fā)工程師缺乏 C 語(yǔ)言的基本概念,我這里大致說(shuō)一下 C 代碼中的結(jié)構(gòu)體。
首先我們需要知道有結(jié)構(gòu)體類(lèi)型和結(jié)構(gòu)體變量。
結(jié)構(gòu)體類(lèi)型在 C 語(yǔ)言中的定義如下:
struct mystruct_T
{
uint8 a;
int16 b;
uint16 c;
};
這里 mystruct_T 就是結(jié)構(gòu)體類(lèi)型。結(jié)構(gòu)體類(lèi)型是一種組合數(shù)據(jù)類(lèi)型,不同于數(shù)組,結(jié)構(gòu)體的元素是可以有不同數(shù)據(jù)類(lèi)型的,上面的例子中 a、b、c 的數(shù)據(jù)類(lèi)型各不相同。
我們可以像使用基本數(shù)據(jù)類(lèi)型一樣使用結(jié)構(gòu)體類(lèi)型去定義變量,使用結(jié)構(gòu)體類(lèi)型定義的變量是結(jié)構(gòu)體變量,比如:
mystruct_T mystruct_var;
那么mystruct_var就是一個(gè)結(jié)構(gòu)體變量,可以通過(guò)如下結(jié)構(gòu)體變量右側(cè)加點(diǎn)來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)體變量中的元素,比如:
mystruct_var.a = 30;
或者:
tmp = mystruct_var.c;
這樣,我們就有了結(jié)構(gòu)體類(lèi)型 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 語(yǔ)言中定義變量的時(shí)候,可以定義單個(gè)變量,也可以定義一個(gè)數(shù)組,比如:
int8 x[10];
結(jié)構(gòu)體類(lèi)型同樣也可以用于定義結(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ù)組。
開(kāi)始介紹之前,請(qǐng)大家記住兩點(diǎn):
C 代碼中的結(jié)構(gòu)體變量跟模型中的 Bus 信號(hào)相對(duì)應(yīng)
C 代碼中的結(jié)構(gòu)體類(lèi)型跟模型中的 Bus 對(duì)象相對(duì)應(yīng)
一. 結(jié)構(gòu)體變量的代碼實(shí)現(xiàn)
有模型如下:
數(shù)據(jù)字典中有 Bus對(duì)象 myBus 定義如下:
將 Inport 端口的數(shù)據(jù)類(lèi)型設(shè)置為 myBus,Inport 的外觀(guān)發(fā)生變化,變成環(huán)形。為控制結(jié)構(gòu)體變量的變量名如我們所期望,在信號(hào)線(xiàn)上設(shè)置信號(hào)名 x、y。然后在數(shù)據(jù)字典中分別定義信號(hào)對(duì)象 x、y。將 x、y 的數(shù)據(jù)類(lèi)型設(shè)置為 myBus,如下圖:
當(dāng)然,x、y 的存儲(chǔ)類(lèi)設(shè)置跟非結(jié)構(gòu)體代碼生成一樣,這里分別設(shè)置為 ImportedExtern 和 ExportedGlobal。
除此之外,還需要把 BusCreator 的輸出數(shù)據(jù)類(lèi)型設(shè)置為 myBus,如果你沒(méi)做這個(gè)設(shè)置, Embeded Coder 會(huì)提醒你設(shè)置。
做好上述設(shè)置,以及代碼生成的基本設(shè)置之后,Build 模型,代碼就有了,你會(huì)發(fā)現(xiàn)結(jié)構(gòu)體類(lèi)型 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ù)類(lèi)型改為 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文章
4900瀏覽量
70674 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28942 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
11111
發(fā)布評(píng)論請(qǐng)先 登錄
TechWiz LCD 2D應(yīng)用:不同結(jié)構(gòu)下的VT曲線(xiàn)
滲壓計(jì)在混凝土結(jié)構(gòu)體中的安裝指南

TechWiz LCD 2D應(yīng)用:IPS電極仿真
程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)
概倫電子先進(jìn)器件建模平臺(tái)BSIMProPlus介紹

TechWiz LCD 2D應(yīng)用:不同結(jié)構(gòu)下的VT曲線(xiàn)
VirtualLab:系統(tǒng)建模分析器
TechWiz LCD 3D應(yīng)用:表面反射(底面)
VirtualLab Fusion應(yīng)用:用于抑制高衍射級(jí)次的角濾波體光柵
結(jié)構(gòu)體成員的順序會(huì)影響結(jié)構(gòu)體的大小嗎
圖紙模板中的文本變量

評(píng)論