鑒于有不少模型開發工程師缺乏 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文章
4798瀏覽量
68714 -
變量
+關注
關注
0文章
613瀏覽量
28402 -
結構體
+關注
關注
1文章
130瀏覽量
10852
發布評論請先 登錄
相關推薦
評論