ð TOP / ã¬ã¬ã·ãŒC++ L7ïŒãã€ã³ã¿ã»ã¢ã©ã€ã¡ã³ãã»ãã€ããª
ã¬ã¬ã·ãŒç¬¬7ç« ïŒãã€ã³ã¿æŒç®ãšæåã¡ã¢ãªã¢ã©ã€ã¡ã³ãã®æ·±æ·µ
ããŒããŠã§ã¢å¢çã»ãšã³ãã£ã¢ã³å€æã»ãã€ãããã¯æ§é äœã«ãããã€ããªéä¿¡ãšã»ãŒãããŒã¿
ã²ãŒã éçºã®çŸå Žã§ã¯ãã»ãŒãããŒã¿ã®ä¿åããããã¯ãŒã¯å¯ŸæŠã®ãã±ããéä¿¡ã§ããã€ããªããŒã¿ã®èªã¿æžãããå¿
é ãšãªããŸããããããCèšèªæµã«æ§é äœããã®ãŸãŸ `fwrite(&player, sizeof(player), 1, fp);` ã§ãã³ããããšãç°å¢ã«ãã£ãŠããŒã¿ãå£ãããæ§é äœããã£ã³ã°ïŒPaddingïŒããå¢çæŽåïŒAlignmentïŒãããšã³ãã£ã¢ã³ïŒEndiannessïŒãã®çœ ã«çŽé¢ããŸããCPUãã¡ã¢ãªããã§ããããç©ççä»çµã¿ããã€ã³ã¿æŒç®ã®æ£ããåãã£ã¹ãããããŠç§»æ€æ§ã®é«ãå®å
šãªãã€ããªã·ãªã¢ã©ã€ã¶ã®èšèšææ³ã培åºè§£åããŸãã
L7.1 æ§é äœããã®ãŸãŸãã³ãããŠã¯ãããªãïŒïŒããã£ã³ã°ãšã¢ã©ã€ã¡ã³ãã®çœ
`sizeof(char + int + short)` ã 1 + 4 + 2 = 7ãã€ãã«ãªããªãæªçŸè±¡ïŒCPUã®ããŒã¿ãã¹æ§é ãšå¢çæŽåïŒAlignmentïŒã®ããŒããŠã§ã¢çå¿
ç¶æ§ãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çã倧æšäºã§ãâŠâŠïŒèªæ©ã®ãã€ã¹ã³ã¢ã座æšãä¿åããã»ãŒãæ©èœãäœã£ããã§ãã`fwrite(&saveData, sizeof(saveData), 1, fp);` ã§ãã¡ã€ã«ã«æžãåºãããã§ããããã¡ã€ã«ãµã€ãºãèšç®ãšåããªãããåéã®PCã«æž¡ãããã¹ã³ã¢ã0ç¹ã«ãªã£ãŠèªæ©ãç»é¢å€ãžå¹ãé£ã³ãŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒåå¿è
ã100人ããã99人ãäžåºŠã¯èžã¿æããæ§é äœããã£ã³ã°ïŒPaddingïŒãšå¢çæŽåïŒAlignmentïŒãã®èœãšã穎ãããªïŒæ§é äœã®ã¡ã¢ãªãçãã³ãããŠãã¡ã€ã«ããããã¯ãŒã¯ã«æµããŠã¯çµ¶å¯Ÿã«ãããã®ããïŒ
ð§ ãã³ã®ã³å
茩
ãã£ïŒïŒã§ãæ§é äœã£ãŠã宣èšãã倿°ãé çªã«ã¡ã¢ãªã«ããããªäžŠãã§ããããããªããã§ããïŒ`char`ïŒ1ãã€ãïŒãš `int`ïŒ4ãã€ãïŒãš `short`ïŒ2ãã€ãïŒãªããåèš7ãã€ããããªããã§ããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
çããçãããããããã³ïŒCPUã¯ã¡ã¢ãªããããŒã¿ã1ãã€ããã€ããããèªãã§ããããã§ã¯ãªãïŒ32bit CPUãªã4ãã€ãåäœã64bit CPUãªã8ãã€ãåäœã®ãã¯ãŒãå¢çãã«åãããŠäžåºŠã«ãã§ããããããããå¢çãè·šããšèªã¿èŸŒã¿é床ãã¬ã¿èœã¡ããããããŒããŠã§ã¢äŸå€ïŒBus ErrorïŒã§ã¯ã©ãã·ã¥ãããã ããã³ã³ãã€ã©ã芪åå¿ã§ãèŠããªãééïŒããã£ã³ã°ïŒããåæã«æã¿èŸŒãã§ããããããïŒ
### ã¡ã¢ãªã¢ã©ã€ã¡ã³ãïŒå¢çæŽåïŒãšã¯äœãïŒ CPUã¯ç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ããéã**ãèªåã®ã¯ãŒããµã€ãºïŒ4ãã€ããŸãã¯8ãã€ãïŒã®åæ°ã®ã¢ãã¬ã¹ã** ããäžåºŠã«ããŒã¿ãèªã¿åºããŸãã ãã `int`ïŒ4ãã€ãïŒã奿°ã¢ãã¬ã¹ïŒäŸãã° `0x1001`ïŒã«é
眮ãããŠããå ŽåãCPU㯠`0x1000` ãš `0x1004` ã®2åã¡ã¢ãªãèªã¿åºãããããããããã·ããããŠçµåããªããã°ãªããŸãããããã¯**倧ããªæ§èœå£åïŒãã¹ã¢ã©ã€ã¡ã³ãããã«ãã£ïŒ**ãåŒãèµ·ãããARMãªã©ã®çµã¿èŸŒã¿ããã»ããµã§ã¯**ã¢ã©ã€ã¡ã³ãéåäŸå€ïŒSIGBUSïŒã§å³åº§ã«ã¯ã©ãã·ã¥**ããŸãã ãã®ãããã³ã³ãã€ã©ã¯ååã®ã¢ã©ã€ã¡ã³ãå¶çŽïŒéåžžã¯ãã®åã® `sizeof` ã®åæ°ïŒãæºãããããã¡ã³ãéã«**ããã£ã³ã°ãã€ãïŒç©ºãé åïŒ**ãèªåæ¿å
¥ããŸãã ```text ãã¡ã¢ãªäžã®é
眮æ¯èŒã æªæé©åæ§é äœïŒ [ char isAlive (1B) ][ ããã£ã³ã° (3B) ][ int score (4B) ][ short level (2B) ][ ããã£ã³ã° (2B) ] åèš: 12 ãã€ãïŒïŒ5ãã€ããç¡é§ãªééãããïŒ å®£èšé åºãæé©åããæ§é äœïŒå€§ããåããé ã«äžŠã¹ãïŒïŒ [ int score (4B) ][ short level (2B) ][ char isAlive (1B) ][ ããã£ã³ã° (1B) ] åèš: 8 ãã€ãïŒïŒ4ãã€ããã¡ã¢ãªãç¯çŽã§ããïŒïŒ ``` > [!TIP] > **æ§é äœèšèšã®éåïŒå€§ããåã®ã¡ã³ãããå
ã«å®£èšããïŒ** > `double` ã `int64_t`ïŒ8BïŒâ `int` ã `float`ïŒ4BïŒâ `short`ïŒ2BïŒâ `char` ã `bool`ïŒ1BïŒã®é ã«äžŠã¹ãã ãã§ãããã£ã³ã°ã®çºçãæå°éã«æããããŸãã
L7.2 ãã€ã³ã¿æŒç®ã®æ·±æ·µïŒåãšã¹ãã©ã€ãããšã³ãã£ã¢ã³ã®å£
`ptr + 1` ã¯äœãã€ãé²ãã®ãïŒ`char*` ãã£ã¹ãã«ããçã¡ã¢ãªèµ°æ»ãšããªãã«ãšã³ãã£ã¢ã³ vs ããã°ãšã³ãã£ã¢ã³ã®ãã€ãé 倿ãè§£ãæãããŸãã
ð§ ãã³ã®ã³å
茩
å
çãCèšèªã®ãã€ããªããŒãµãŒã®ã³ãŒããèªãã§ãããšã`char* p = (char*)buffer;` ã®ããã«ç¡çãããã£ã¹ãã㊠`p += 4;` ã®ããã«è¶³ãç®ããŠããã®ãããèŠãããŸãããã€ã³ã¿ã«æ°å€ãè¶³ããšãã¡ã¢ãªã®ã¢ãã¬ã¹ããã®ãŸãŸå¢ãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããããã€ã³ã¿æŒç®ïŒPointer ArithmeticïŒã®æå€§ã®åæããïŒ`int* p` ã« `+1` ããããã¢ãã¬ã¹ã¯ 1 ã§ã¯ãªã `sizeof(int)`ïŒã€ãŸã4ãã€ãïŒé²ãïŒåã«ãã£ãŠã1æ©ã®æ©å¹
ïŒã¹ãã©ã€ãïŒããå€ããããããã
ð§ ãã³ã®ã³å
茩
ããã£ããšããããšã¯åã®ãµã€ãºãæèããã«ãã€ã³ã¿ãè¶³ãç®ãããšããã£ãšããéã«ç®çã®ããŒã¿ãè¡ãéããŠããŸããã§ããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãïŒããã«æãããã®ãããšã³ãã£ã¢ã³ïŒEndiannessïŒãããïŒ`0x12345678` ãšããæ°å€ãã¡ã¢ãªã«çœ®ããšããæäžäœãã€ãã® `0x78` ããé ã«çœ®ãã®ããªãã«ãšã³ãã£ã¢ã³ïŒPCã»ã¹ããã®CPUïŒãæäžäœã® `0x12` ãã眮ãã®ãããã°ãšã³ãã£ã¢ã³ïŒãããã¯ãŒã¯éä¿¡ã®æšæºïŒããããæ£ããå転ã§ããã°ãé信察æŠã²ãŒã ã¯æç«ããã®ããïŒ
### ãã€ã³ã¿ã®æ©å¹
ïŒã¹ãã©ã€ãïŒãšãã€ã³ã¿æŒç®ã®ã«ãŒã« ãã€ã³ã¿ã«å¯Ÿããå æžç®ã¯ã**ãã¢ãã¬ã¹ã®æ°å€å ç®ãã§ã¯ãªããé
åã®èŠçŽ ã€ã³ããã¯ã¹ç§»åã** ãšããŠå®çŸ©ãããŠããŸãã ```cpp int arrInt[4]; int* pInt = arrInt; pInt += 1; // å®éã®ã¢ãã¬ã¹ã¯ +4 ãã€ãé²ãïŒsizeof(int) == 4ïŒ double arrDbl[4]; double* pDbl = arrDbl; pDbl += 1; // å®éã®ã¢ãã¬ã¹ã¯ +8 ãã€ãé²ãïŒsizeof(double) == 8ïŒ // çãã€ãåäœã§ç§»åãããå Žåã¯å¿
ã uint8_t* ãŸã㯠char* ã«ãã£ã¹ããã uint8_t* pByte = reinterpret_cast<uint8_t*>(arrInt); pByte += 1; // å®éã®ã¢ãã¬ã¹ãæ£ç¢ºã« +1 ãã€ãé²ã ``` ### ãšã³ãã£ã¢ã³ïŒãã€ãé ïŒã®æ±ºå®çãªéã `uint32_t value = 0x12345678;` ãã¡ã¢ãªã«æ ŒçŽããå ŽåïŒ | æ¹åŒ | ã¢ãã¬ã¹ N | ã¢ãã¬ã¹ N+1 | ã¢ãã¬ã¹ N+2 | ã¢ãã¬ã¹ N+3 | æ¡çšäŸ | | :--- | :--- | :--- | :--- | :--- | :--- | | **ãªãã«ãšã³ãã£ã¢ã³** (äžäœæ¡ãå
) | `0x78` | `0x56` | `0x34` | `0x12` | x86, x64, ARM (PC, iOS, Android) | | **ããã°ãšã³ãã£ã¢ã³** (äžäœæ¡ãå
) | `0x12` | `0x34` | `0x56` | `0x78` | TCP/IPãããã¯ãŒã¯, PS3(Cell) | > [!WARNING] > **Strict Aliasing RuleïŒå³æ Œãªå¥åèŠçŽïŒã®çœ ãšã¢ãã³C++20ã®è§£æ±ºç** > `char*` ã `uint8_t*` 以å€ã®ç°ãªãåå士ã§ãã€ã³ã¿ãçžäºãã£ã¹ãããŠã¢ã¯ã»ã¹ïŒäŸ: `*(int*)&myFloat` ã `reinterpret_cast<int*>(&myFloat)` ã«ããåãã³ãã³ã°ïŒãããšãC++èŠæ Œäžã®**æªå®çŸ©åäœïŒUndefined Behavior: UBïŒ**ãšãªããŸããã³ã³ãã€ã©ã¯ãç°ãªãåã®ãã€ã³ã¿ã¯åäžã¡ã¢ãªé åãæããªãããšä»®å®ããŠæé©åïŒTBAA: Type-Based Alias AnalysisïŒãè¡ãããã倿°ã®èªã¿æžãé åºãçããDebugçã§ã¯åãã®ã«Releaseãã«ãã§äžå¯è§£ãªãã°ãçã¿ãŸãã > - **C++17以åã®å®å
šç**: `std::memcpy(&raw, &val, sizeof(float))` ã䜿çšããïŒçŸä»£ã®æé©åã³ã³ãã€ã©ã¯ memcpy åŒåºãå®å
šã«æ¶å»ããã¬ãžã¹ã¿éã®åäžç§»ååœä»€ã«æé©åããŸãïŒã > - **C++20以éã®ç©¶æ¥µè§£**: `<bit>` ãããã® `std::bit_cast<uint32_t>(val)` ã䜿çšãããã³ã³ãã€ã«æå®æ°åŒïŒ`constexpr`ïŒã§ãè©äŸ¡å¯èœã§ãæªå®çŸ©åäœãŒããã€å®å
šãªãŒããªãŒããŒãããã§ãããåãå®å
šã«åè§£éã§ããŸãã
L7.3 å®è·µïŒå®å
šãªãã€ããªã»ãŒãããŒã¿ïŒãã±ããã¹ããªãŒã ã®èšèš
ã¢ã©ã€ã¡ã³ããšãšã³ãã£ã¢ã³ãå
æãããBinaryWriter / BinaryReaderãã¯ã©ã¹ãæ§ç¯ããèªæ©ã®ã»ãŒãããŒã¿ãå®å
šã»ã³ã³ãã¯ãã«ã·ãªã¢ã©ã€ãºããŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çãæ§é äœã®çãã³ããå±éºãªããå®éã®ã²ãŒã ããã°ã©ãã³ã°ã§ã¯ã©ããã£ãŠèªæ©ã®åº§æšãã€ã³ãã³ããªãä¿åããŠãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããïŒçŸå Žã§ã¯ãBinaryWriter / BinaryReaderããšããã¹ããªãŒã ãããã¡ã¯ã©ã¹ãäœãã®ãåžžå¥ææ®µãããå
é ã«ããžãã¯ãã³ããŒïŒäŸ: `"SKRM"`ïŒãšããŒã¿ããŒãžã§ã³ãå»ã¿ã1ãã€ããã€ãšã³ãã£ã¢ã³ãçµ±äžããŠå®å
šã«èªã¿æžããããããïŒ
ð§ ãã³ã®ã³å
茩
ããžãã¯ãã³ããŒïŒããã²ãŒã ãã¡ã€ã«ã®å
é ã«ãããPNGããšããRIFFãã¿ãããªãã¡ã€ã«èå¥ãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãïŒããŒãžã§ã³çªå·ãããã°ãå°æ¥ã²ãŒã ãã¢ããããŒãããŠã»ãŒãããŒã¿é
ç®ãå¢ããŠããéå»ã®ã»ãŒãããŒã¿ãå®å
šã«ã³ã³ããŒãã§ããããããããã®ã»ãŒãããŒã¿èšèšããïŒ
ð BinaryStream.h
#ifndef BINARY_STREAM_H
#define BINARY_STREAM_H
#include <vector>
#include <string>
#include <cstdint>
#include <stdexcept>
#include <cstring>
// å®å
šãªãã€ããªæžã蟌ã¿ã¯ã©ã¹ïŒãªãã«ãšã³ãã£ã¢ã³çµ±äžïŒ
class BinaryWriter {
private:
std::vector<uint8_t> m_buffer;
public:
BinaryWriter() {}
// 1ãã€ãæžã蟌ã¿
void writeUint8(uint8_t val) {
m_buffer.push_back(val);
}
// 16bitæŽæ°æžã蟌ã¿ïŒãªãã«ãšã³ãã£ã¢ã³ïŒ
void writeUint16(uint16_t val) {
m_buffer.push_back(static_cast<uint8_t>(val & 0xFF));
m_buffer.push_back(static_cast<uint8_t>((val >> 8) & 0xFF));
}
// 32bitæŽæ°æžã蟌ã¿ïŒãªãã«ãšã³ãã£ã¢ã³ïŒ
void writeUint32(uint32_t val) {
m_buffer.push_back(static_cast<uint8_t>(val & 0xFF));
m_buffer.push_back(static_cast<uint8_t>((val >> 8) & 0xFF));
m_buffer.push_back(static_cast<uint8_t>((val >> 16) & 0xFF));
m_buffer.push_back(static_cast<uint8_t>((val >> 24) & 0xFF));
}
// float (32bitæµ®åå°æ°ç¹) æžã蟌㿠(memcpyã§ãšã€ãªã¢ã·ã³ã°ã«ãŒã«éµå®)
void writeFloat(float val) {
uint32_t raw;
std::memcpy(&raw, &val, sizeof(float));
writeUint32(raw);
}
// æååæžã蟌㿠(é·ã uint16 + æååãã€ãå)
void writeString(const std::string& str) {
writeUint16(static_cast<uint16_t>(str.size()));
for (char c : str) {
writeUint8(static_cast<uint8_t>(c));
}
}
// 宿ãããããã¡åç
§
const std::vector<uint8_t>& getBuffer() const { return m_buffer; }
size_t getSize() const { return m_buffer.size(); }
};
// å®å
šãªãã€ããªèªã¿åºãã¯ã©ã¹
class BinaryReader {
private:
const uint8_t* m_data;
size_t m_size;
size_t m_cursor;
public:
BinaryReader(const uint8_t* data, size_t size)
: m_data(data), m_size(size), m_cursor(0) {}
bool hasRemaining(size_t bytes) const {
return m_cursor + bytes <= m_size;
}
uint8_t readUint8() {
if (!hasRemaining(1)) throw std::runtime_error("Unexpected End of Stream");
return m_data[m_cursor++];
}
uint16_t readUint16() {
if (!hasRemaining(2)) throw std::runtime_error("Unexpected End of Stream");
uint16_t b0 = m_data[m_cursor++];
uint16_t b1 = m_data[m_cursor++];
return static_cast<uint16_t>(b0 | (b1 << 8));
}
uint32_t readUint32() {
if (!hasRemaining(4)) throw std::runtime_error("Unexpected End of Stream");
uint32_t b0 = m_data[m_cursor++];
uint32_t b1 = m_data[m_cursor++];
uint32_t b2 = m_data[m_cursor++];
uint32_t b3 = m_data[m_cursor++];
return b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
}
float readFloat() {
uint32_t raw = readUint32();
float val;
std::memcpy(&val, &raw, sizeof(float));
return val;
}
std::string readString() {
uint16_t len = readUint16();
if (!hasRemaining(len)) throw std::runtime_error("Unexpected End of Stream in String");
std::string str(reinterpret_cast<const char*>(m_data + m_cursor), len);
m_cursor += len;
return str;
}
};
#endif // BINARY_STREAM_H
ð SaveDataPacket.h
#ifndef SAVE_DATA_PACKET_H
#define SAVE_DATA_PACKET_H
#include "BinaryStream.h"
#include <string>
// èªæ©ã®ã»ãŒãããŒã¿æ§é äœ
struct PlayerSaveState {
std::string playerName; // ãã¬ã€ã€ãŒå
float posX; // X座æš
float posY; // Y座æš
uint32_t score; // ãã€ã¹ã³ã¢
uint16_t hp; // æ®ãäœå
uint8_t weaponLevel;// æŠåšã¬ãã«
};
// ãããä»ãã»ãŒãããŒã¿ãã±ãã管çã¯ã©ã¹
class SaveDataPacket {
public:
static const uint32_t MAGIC_HEADER = 0x4D524B53; // "SKRM" (ãªãã«ãšã³ãã£ã¢ã³)
static const uint16_t CURRENT_VERSION = 1;
// ã»ãŒãããŒã¿ããã€ããªãããã¡ã«ã·ãªã¢ã©ã€ãº
static std::vector<uint8_t> serialize(const PlayerSaveState& player) {
BinaryWriter writer;
// 1. ãããæ
å ± (ããžãã¯ãã³ã㌠+ ããŒãžã§ã³)
writer.writeUint32(MAGIC_HEADER);
writer.writeUint16(CURRENT_VERSION);
// 2. ãã¬ã€ã€ãŒããŒã¿æ¬äœ
writer.writeString(player.playerName);
writer.writeFloat(player.posX);
writer.writeFloat(player.posY);
writer.writeUint32(player.score);
writer.writeUint16(player.hp);
writer.writeUint8(player.weaponLevel);
return writer.getBuffer();
}
// ãã€ããªãããã¡ããã»ãŒãããŒã¿ãå®å
šã«ãã·ãªã¢ã©ã€ãº
static bool deserialize(const uint8_t* data, size_t size, PlayerSaveState& outPlayer) {
try {
BinaryReader reader(data, size);
// 1. ããžãã¯ãã³ããŒæ€èšŒ
uint32_t magic = reader.readUint32();
if (magic != MAGIC_HEADER) {
return false; // äžæ£ãªãã¡ã€ã«ãã©ãŒããã
}
// 2. ããŒãžã§ã³ç¢ºèª
uint16_t version = reader.readUint16();
if (version != CURRENT_VERSION) {
return false; // æªå¯Ÿå¿ããŒãžã§ã³
}
// 3. ããŒã¿åŸ©å
outPlayer.playerName = reader.readString();
outPlayer.posX = reader.readFloat();
outPlayer.posY = reader.readFloat();
outPlayer.score = reader.readUint32();
outPlayer.hp = reader.readUint16();
outPlayer.weaponLevel = reader.readUint8();
return true;
} catch (...) {
return false; // ããŒã¿ç Žæ
}
}
};
#endif // SAVE_DATA_PACKET_H
ð main.cpp
#include <iostream>
#include <iomanip>
#include "SaveDataPacket.h"
void dumpHex(const std::vector<uint8_t>& buf) {
std::cout << "[ãã€ããªãã³ã (" << buf.size() << " bytes)]:" << std::endl;
for (size_t i = 0; i < buf.size(); ++i) {
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(buf[i]) << " ";
if ((i + 1) % 8 == 0) std::cout << " ";
if ((i + 1) % 16 == 0) std::cout << std::endl;
}
std::cout << std::dec << std::endl;
}
int main() {
std::cout << "=== ã·ãã¯ãC++ã©ã L7: ãã€ããªã·ãªã¢ã©ã€ãºå®èšŒ ===" << std::endl;
// 1. ã»ãŒããããã¬ã€ã€ãŒããŒã¿äœæ
PlayerSaveState original;
original.playerName = "ShirokumaAce";
original.posX = 128.5f;
original.posY = 256.0f;
original.score = 987654;
original.hp = 100;
original.weaponLevel = 3;
// 2. ã·ãªã¢ã©ã€ãºå®è¡ïŒãã€ãååïŒ
std::vector<uint8_t> binaryData = SaveDataPacket::serialize(original);
dumpHex(binaryData);
// 3. ãã·ãªã¢ã©ã€ãºå®è¡ïŒåŸ©å
ïŒ
PlayerSaveState loaded;
bool success = SaveDataPacket::deserialize(binaryData.data(), binaryData.size(), loaded);
if (success) {
std::cout << "â
ã»ãŒãããŒã¿ã®åŸ©å
ã«æåããŸããïŒ" << std::endl;
std::cout << " ãã¬ã€ã€ãŒå: " << loaded.playerName << std::endl;
std::cout << " åº§æš (X, Y) : (" << loaded.posX << ", " << loaded.posY << ")" << std::endl;
std::cout << " ã¹ã³ã¢ : " << loaded.score << std::endl;
std::cout << " æ®ãHP : " << loaded.hp << std::endl;
std::cout << " æŠåšã¬ãã« : " << static_cast<int>(loaded.weaponLevel) << std::endl;
} else {
std::cout << "â ããŒã¿ç ŽæãŸãã¯ç¡å¹ãªãããã§ãã" << std::endl;
}
return 0;
}
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. 以äžã®æ§é äœ Data ã® sizeof(Data) ã¯ãäžè¬ç㪠64bit ç°å¢ïŒint: 4B, double: 8B, short: 2BïŒã§äœãã€ãã«ãªãã§ããããïŒ
struct Data {
char a; // 1ãã€ã
double b; // 8ãã€ã
short c; // 2ãã€ã
};
1. 1 + 8 + 2 = 11ãã€ãïŒããã£ã³ã°ãªãïŒ 2. 16ãã€ãïŒaã®åŸãã«7ãã€ãããã£ã³ã°ãæ«å°Ÿããã£ã³ã°ãªãïŒ 3. 24ãã€ãïŒaã®åŸãã«7ãã€ããcã®åŸãã«6ãã€ãã®ããã£ã³ã°ãæ¿å
¥ãããïŒ 4. 32ãã€ãïŒãã¹ãŠã®ã¡ã³ãã8ãã€ãåäœã«æ¡åŒµãããïŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒ24ãã€ãïŒaã®åŸãã«7ãã€ããcã®åŸãã«6ãã€ãã®ããã£ã³ã°ãæ¿å
¥ãããïŒ
æ£è§£ã¯ 24ãã€ã ã§ããdouble ã®ã¢ã©ã€ã¡ã³ãå¶çŽïŒ8ãã€ãå¢çïŒãæºãããããchar a ã®çŽåŸã« 7ãã€ãã®ããã£ã³ã°ãæ¿å
¥ãããŸããããã«ãæ§é äœã®é
åãäœæããéã«æ¬¡ã®èŠçŽ ã® double ãæ£ãã8ãã€ãå¢çã«äžŠã¶ãããæ«å°Ÿã® short cïŒ2BïŒã®åŸãã«ã 6ãã€ãã®ããã£ã³ã°ãæ¿å
¥ãããå
šäœãµã€ãºãæå€§ã®åã¢ã©ã€ã¡ã³ãïŒ8BïŒã®åæ°ã§ãã 24ãã€ã ã«æããããŸãã
Q2. ååã®æ§é äœ Data ã®ã¡ã¢ãªäœ¿çšéãæå°ã«ããããã®ãæãé©åãªã¡ã³ã宣èšé åºã¯ã©ãã§ããããïŒ
1. struct Data { char a; short c; double b; }; 2. struct Data { double b; short c; char a; }; 3. struct Data { short c; double b; char a; }; 4. 宣èšé åºãå€ããŠãããã£ã³ã°ã¯å€ãããªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒstruct Data { double b; short c; char a; };
æ£è§£ã¯ãstruct Data { double b; short c; char a; };ãã§ãã倧ããåããé ã«äžŠã¹ããšãdouble b (8B) ïŒ short c (2B) ïŒ char a (1B) ãšãªããæå¹ããŒã¿ã¯ 11ãã€ãã8ãã€ãå¢çã«æããããã®æ«å°Ÿããã£ã³ã°ã¯ 5ãã€ãã®ã¿ãšãªããåèš 16ãã€ã ã«çž®å°ã§ããŸãïŒ24ãã€ããã8ãã€ããç¯çŽå¯èœïŒã
Q3. ãªãã«ãšã³ãã£ã¢ã³ã®ã·ã¹ãã ã«ãããŠã32bitæŽæ°å€ 0x12345678 ãã¡ã¢ãªã«æžã蟌ãã å Žåãå
é ã¢ãã¬ã¹ããé ã«é
眮ããããã€ãåã¯ã©ãã§ããããïŒ
1. 0x12, 0x34, 0x56, 0x78 2. 0x78, 0x56, 0x34, 0x12 3. 0x56, 0x78, 0x12, 0x34 4. 0x78, 0x12, 0x56, 0x34
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒ0x78, 0x56, 0x34, 0x12
æ£è§£ã¯ã0x78, 0x56, 0x34, 0x12ãã§ãããªãã«ãšã³ãã£ã¢ã³ïŒLittle EndianïŒã§ã¯ãæ°å€ã®æäžäœãã€ãïŒLeast Significant Byte: 0x78ïŒãæãå°ããã¢ãã¬ã¹ïŒå
é ïŒã«é
眮ãããæäžäœãã€ãïŒ0x12ïŒãæ«å°Ÿã¢ãã¬ã¹ã«é
眮ãããŸãã
Q4. ãããã¯ãŒã¯éä¿¡ãã»ãŒãããŒã¿ä¿åã«ãããŠãC++æ§é äœããã®ãŸãŸ fwrite(&obj, sizeof(obj), ...) ããŠã¯ãããªãæå€§ã®çç±ã¯äœã§ããããïŒ
1. fwrite 颿°ã¯ããã¹ããã¡ã€ã«å°çšã§ããããã€ããªãæžã蟌ããªããã 2. ã³ã³ãã€ã©ãOSã«ãã£ãŠããã£ã³ã°ãµã€ãºããšã³ãã£ã¢ã³ãç°ãªããä»ã®ç°å¢ã§ããŒã¿ãç Žæã»åãããã 3. æ§é äœã®äžã«ãã€ã³ã¿ã1ã€ã§ãå«ãŸããŠãããšã³ã³ãã€ã«ãšã©ãŒã«ãªããã 4. C++ã§ã¯ãã¡ã€ã«å
¥åºåã« std::cout ãã䜿ããªã仿§ã«ãªã£ãŠãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã³ã³ãã€ã©ãOSã«ãã£ãŠããã£ã³ã°ãµã€ãºããšã³ãã£ã¢ã³ãç°ãªããä»ã®ç°å¢ã§ããŒã¿ãç Žæã»åãããã
æ£è§£ã¯ãã³ã³ãã€ã©ãOSã«ãã£ãŠããã£ã³ã°ãµã€ãºããšã³ãã£ã¢ã³ãç°ãªããä»ã®ç°å¢ã§ããŒã¿ãç Žæã»åãããããã§ããã³ã³ãã€ã©ããŒãžã§ã³ã32bit/64bitç°å¢ã®éããCPUãšã³ãã£ã¢ã³ã®éãã«ãããçã¡ã¢ãªã®ãã³ãããŒã¿ã¯äºææ§ãç Žå£ãããŸããçŸå Žã§ã¯æ¬ç« ã§äœæãã BinaryWriter ã®ããã«æç€ºçã«ãã€ãåãžãããã³ã°ããŠä¿åã»éä¿¡ããã®ãéåã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â