私は組み込み機器用の「最初の」Cソフトウェアを開発しています。
ooスタイルでコードを書きたいので、構造体を使い始めました。
typedef struct sDrawable {
Dimension size;
Point location;
struct sDrawable* parent;
bool repaint;
bool focused;
paintFunc paint;
} Drawable;
typedef struct sPanel {
Drawable drw;
struct sDrawable* child;
uint16_t bgColor;
} Panel;
私はmallocを使用できず、使用したくないので、構造体をインスタンス化するためのより良い方法を検索します。これは受け入れられますか?
Panel aPanel={0};
void Gui_newPanel(Panel* obj, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bgColor) {
// Drw is a macro to cast to (Drawable*)
Drw(obj)->repaint = true;
Drw(obj)->parent= NULL;
Drw(obj)->paint = (paintFunc) &paintPanel;
Drw(obj)->location=(Point){x, y};
Drw(obj)->size=(Dimensione){w, h};
obj->child = NULL;
obj->bgColor = bgColor;
}
void Gui_init(){
Gui_newPanel(&aPanel, 0, 0, 100, 100, RED);
}
アップデート
最初のものでは、Panel aPanel={0};
Gui_newPanel関数にポインタを渡すように構造体を初期化する必要があります。そうしないと、書き込みしかできませPanel aPanel;
んか?私はテストして両方とも動作しましたが、たぶん私は運が悪いだけです...
それともこれはより良い方法ですか?
Panel aPanel;
Panel Gui_newPanel(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bgColor) {
// Drw is a macro to cast to (Drawable*)
Panel obj;
Drw(&obj)->repaint = true;
Drw(&obj)->parent= NULL;
Drw(&obj)->paint = (paintFunc) &paintPanel;
Drw(&obj)->location = (Point){x, y};
Drw(&obj)->size = (Dimension){w, h};
obj.child = NULL;
obj.bgColor = bgColor;
return obj;
}
void Gui_init(){
aPanel=Gui_newPanel(0, 0, 100, 100, RED);
}
これらの方法のどれが好ましいですか?
特にパフォーマンスとメモリ使用量に関心があります。
ありがとう