Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Pack | Compiler Directives and Advanced Control
/
C Preprocessing
セクション 4.  2
single

single

bookPack

メニューを表示するにはスワイプしてください

Using #pragma pack can reduce the overall size of a structure or ensure precise alignment for specific cases, such as network protocols or hardware interfaces.

main.c

main.c

copy
1234567891011121314
#include <stdio.h> #include <stdint.h> // Without using `#pragma pack` struct Packet { uint8_t flag; // 8 bits or 1 bytes uint16_t length; // 16 bits or 2 bytes uint8_t type; // 8 bits or 1 bytes }; int main() { printf("Size without packing: %zu bytes\n", sizeof(struct Packet)); return 0; }

As you may recall, structure alignment is determined by the largest field within the structure.

Using #pragma pack

main.c

main.c

copy
123456789101112131415
#include <stdio.h> #include <stdint.h> #pragma pack(push, 1) struct PacketPacked { uint8_t flag; // 8 bits = 1 bytes uint16_t length; // 16 bits == 2 bytes uint8_t type; // 8 bits == 1 bytes }; #pragma pack(pop) int main() { printf("Size with packing: %zu bytes\n", sizeof(struct PacketPacked)); return 0; }

The directive #pragma pack(push, 1) creates a local alignment context for a structure.

You start a new alignment scope with push, apply a specific rule (here, 1-byte alignment), define the structure, then restore the previous alignment with pop.

Using push with 1 ensures that all fields are aligned on 1-byte boundaries, with no padding between them.

タスク

スワイプしてコーディングを開始

You're working with a digital sensor that sends binary data packets over UART. Each packet follows a fixed 4-byte layout. To match this exact layout with no padding, use the #pragma pack directive to enforce 1-byte alignment.

BytesFieldType
1Command codeuint8_t
2Sensor valueuint16_t
1Checksumuint8_t
  • Fill in the first ___ to start the packed context with 1-byte alignment.
  • Fill in the second ___ to restore default alignment after the struct.
  • Use the correct field access expressions (e.g. packet.cmd) in each printf to output: the command byte, the 2-byte value and the checksum byte.

解答

Switch to desktop実践的な練習のためにデスクトップに切り替える下記のオプションのいずれかを利用して、現在の場所から続行する
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  2
single

single

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

some-alt