これらの要件は、指定されている順序で満たすことを検討してください。一部の要件は 1 つにまとめられていることに注意してください。これは割り当ての場合によくあります。講師は常に完璧な言語学者や論理学者ではありません。特に IT 講師はそうです。
1: 以下を表すビットを保持する構造体を作成します。
count: 4 ビットの BCD 数
赤色 LED: 1 ビット
緑色 LED: 1 ビット
モーター方向: 2 ビット
構造体に motorStatus という名前を付ける
まず、typedef を使用せずにこれに対応します。int
ビットフィールドの型を使用します。次の要件:
typedef を使用して、この新しいデータ型に名前を付けます: mtrStatus_t
基本的な typedef を記述できることを実証しました。typedef unsigned char mtrStatus_t;
「mtrStatus_t を unsigned char のエイリアスに定義する」という意味です。ここで、「mtrStatus_t をエイリアス struct motorStatus に定義する」という基本的な typedef を次のように記述します。struct motorStatus
定義の後に配置して、コンパイラがエイリアシングの内容を確認できるようにします。
2: 構造体の新しいインスタンスを作成し、motor1Status という名前を付けます。
motor1Status
明確にするために、講師は型mtrStatus_t
orを持つという名前の変数を宣言するように求めていますstruct motorStatus
。変数を宣言できると思いますが、間違っている場合は修正してください。
3: 新しい構造体メンバーを初期化するステートメントを次のように記述します。
カウント: 9 BCD
赤色LED:1
緑色 LED: 0
モーター方向: 10
カウント: 0x09; レッドLED: 0x01; greenLED: 0x00 motorDirection: 0x0A
あなたの講師は、課題ではなく初期化を求めています。char str[] = "fubar";
とではchar str[] = {'h','e','l','l','o','\0'};
、str が宣言され、「fubar」に対応する文字列を格納するために初期化されます。In char str[6]; strcpy(str, "fubar");
str は初期化なしで宣言され、"fubar" の各バイトは str の対応する位置にコピー (割り当て) されます。構造体をどのように初期化しますか? 2 番目のstrの初期化と非常によく似ています。
struct length_prefixed_string {
size_t length;
int zero;
char string[];
};
/* Initialisation here: */
struct length_prefixed_string hello = { .length = 5,
.string = "hello" };
この例では、 struct: の最後でのみ宣言できる柔軟な配列メンバーを使用していますchar string[];
。構造体の末尾にある不明な長さの配列を伝達しますが、これは にカウントされませんsizeof (struct length_prefix_string)
。このため、この例では不明な長さを長さ引数に格納しています。これは少しトピックから外れていますが、上記の初期化(代入ではなく) を見ることができます。この例では、初期化と代入を区別しています。.string
でこの構造体のメンバーを割り当てることはできませんhello.string = "hello";
。
別の違いは次のとおりです。初期化によって言及されていないメンバーにはゼロ値が割り当てられます (ただし、初期化が存在する場合のみ)。したがって、hello.zero
上記の例の値は 0 になります。このため、配列とゼロを宣言できます。 -1 つのステートメントで埋めます: int array[size] = { 0 };
(代入と初期化の別の違い:int array[size]; array = { 0 };
無効です)。そうは言っても、この事実をタスクの目的では無視し、マーキング検査者が誤解しないように greenLED を明示的に初期化することをお勧めします。
ここでお役に立てば幸いです...