2

ねえ、これはすべてCプログラミング用です。

これが私に提示された質問ですが、Cで次のステートメントのコードを正しく書く方法を誰かに教えてもらえますか?参考までに、私はすでにこのクイズに回答しましたが、私の教授は自分で回答を投稿しません。彼がそれを採点したとき、私は非常に貧弱でしたが、これを理解するのを助けるために、私は私の答えを提供します(彼らがそうであるように間違っています)

1:以下を表すビットを保持する構造を作成します。

  • カウント:4ビットのBCD番号
  • 赤色LED:1ビット
  • 緑色のLED:1ビット
  • モーター方向:2ビット

構造にmotorStatusという名前を付けます

typedefを使用して、この新しいデータ型に名前を付けます:mtrStatus_t

typedef unsigned char mtrStatus_t;

struct motorStatus mtrStatus_t {
    mtrStatus_t count: 4;
    mtrStatus_t redLED: 1;
    mtrStatus_t greenLED: 1;
    mtrStatus_t motorDirection: 2;
};

2:構造の新しいインスタンスを作成し、motor1Statusという名前を付けます

motorStatus = motor1Status;

3:次のように、新しい構造体メンバーを初期化するステートメントを記述します。

  • カウント:9 BCD
  • 赤色LED:1
  • 緑色のLED:0
  • モーター方向:10

    カウント:0x09; redLED:0x01; 緑LED:0x00モーター方向:0x0A

4

2 に答える 2

2

最初のものについては、次のようにします。

typedef struct motorStatus  
{
    int count: 4;
    int redLED: 1;
    int greenLED: 1;
    int motorDirection: 2;
} mtrStatus_t;

2番目のものはより似ています:

mtrStatus_t motor1status;

そして最後に:

motor1status.count = 0x9;
motor1status.redLED = 1;
motor1status.greenLED = 0;
motor1status.motorDirection = 0x02;

BCD (2 進化 10 進数) であるため、カウントは 16 進数です。 http://en.wikipedia.org/wiki/Binary-coded_decimal BCD では、0 ~ 9 の数字を表すために 4 ビットを使用します。 、したがって、それを扱う簡単な方法は、16進数を使用することです(これは、数字0x0-0xfを表すために4ビットも使用します)が、BCDでは、数字0xa-0xfを使用しません。

motorDirection が 0x02 である理由は、彼が 10 のモーター方向を望んでいるためですが、それは 2 ビット フィールドであるため、10 バイナリ、つまり 0x02 hex を意味すると想定しています。

于 2013-03-24T04:09:22.560 に答える
0

これらの要件は、指定されている順序で満たすことを検討してください。一部の要件は 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_torを持つという名前の変数を宣言するように求めています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 を明示的に初期化することをお勧めします。

ここでお役に立てば幸いです...

于 2013-03-24T05:21:11.663 に答える