鑒于有不少模型開發(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就是一個結(jié)構(gòu)體變量,可以通過如下結(jié)構(gòu)體變量右側(cè)加點來訪問結(jié)構(gòu)體變量中的元素,比如:
mystruct_var.a = 30;
或者:
tmp = mystruct_var.c;
這樣,我們就有了結(jié)構(gòu)體類型 mystruct_T 和結(jié)構(gòu)體變量 mystruct_var。
我們做一個假設(shè),如果上述結(jié)構(gòu)體里面的元素 c 不是一個單個元素,而是一個結(jié)構(gòu)體變量,情況將會怎么樣?比如:
struct mystruct_T
{
uint8 a;
int16 b;
substruct_T c;
};
結(jié)構(gòu)體里面還套著一個結(jié)構(gòu)體,于是我們就有了結(jié)構(gòu)體嵌套。
我們在 C 語言中定義變量的時候,可以定義單個變量,也可以定義一個數(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ù)組。
開始介紹之前,請大家記住兩點:
C 代碼中的結(jié)構(gòu)體變量跟模型中的 Bus 信號相對應(yīng)
C 代碼中的結(jié)構(gòu)體類型跟模型中的 Bus 對象相對應(yīng)
一. 結(jié)構(gòu)體變量的代碼實現(xiàn)
有模型如下:
數(shù)據(jù)字典中有 Bus對象 myBus 定義如下:
將 Inport 端口的數(shù)據(jù)類型設(shè)置為 myBus,Inport 的外觀發(fā)生變化,變成環(huán)形。為控制結(jié)構(gòu)體變量的變量名如我們所期望,在信號線上設(shè)置信號名 x、y。然后在數(shù)據(jù)字典中分別定義信號對象 x、y。將 x、y 的數(shù)據(jù)類型設(shè)置為 myBus,如下圖:
當然,x、y 的存儲類設(shè)置跟非結(jié)構(gòu)體代碼生成一樣,這里分別設(shè)置為 ImportedExtern 和 ExportedGlobal。
除此之外,還需要把 BusCreator 的輸出數(shù)據(jù)類型設(shè)置為 myBus,如果你沒做這個設(shè)置, Embeded Coder 會提醒你設(shè)置。
做好上述設(shè)置,以及代碼生成的基本設(shè)置之后,Build 模型,代碼就有了,你會發(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)體嵌套的代碼實現(xiàn)
在上述例子中的數(shù)據(jù)字典中再定義一個 Bus 對象 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ù)字典中信號對象 x 和 y 的定義跟前面的例子一樣,結(jié)構(gòu)體變量 x 和 y 在代碼中的定義也跟前面的例子一樣,整個算法的實現(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)體嵌套,對應(yīng)到模型中,就是 Bus 嵌套。
-
代碼
+關(guān)注
關(guān)注
30文章
4922瀏覽量
72232 -
變量
+關(guān)注
關(guān)注
0文章
615瀏覽量
29281 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11248
發(fā)布評論請先 登錄
【產(chǎn)品介紹】Altair MotionView支持多體仿真與優(yōu)化軟件

定義IO初始化結(jié)構(gòu)體
TechWiz LCD 2D應(yīng)用:不同結(jié)構(gòu)下的VT曲線
滲壓計在混凝土結(jié)構(gòu)體中的安裝指南

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

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

評論