मेरे लिए uint8_t "string" बनाना ठीक काम करता है:

uint8_t myString[] = "Foo";

हालांकि जब मैं इसे एक संरचना में घोषित करने की कोशिश करता हूं, तो यह काम नहीं करता है:

#ifndef PLAYER_H_
#define PLAYER_H_

#include <stdint.h>

typedef struct{
    uint32_t id;
    uint8_t name[];
    uint16_t life;
    uint16_t mana;
    uint16_t fist;
    uint16_t shielding;
} player;

#endif // PLAYER_H_

मुझे एक संकलन संदेश मिला है: फ़ील्ड में अपूर्ण प्रकार uint8_t [] है।

मुझे यहाँ क्या याद आ रहा है दोस्तों?

2
Bracketz 15 नवम्बर 2015, 13:28

3 जवाब

सबसे बढ़िया उत्तर
  uint8_t name[];

आपने यहां आकार का उल्लेख नहीं किया है, या तो name के आकार का उल्लेख किया है। आप अपनी संरचना के मध्य में अज्ञात आकार की सरणी नहीं बना सकते।

uint8_t name[50];                // this could do  

और आप इसे इस तरह से शुरू कर सकते हैं -

player p1={.name="hello"};

या memcpy का उपयोग करें।

2
ameyCU 15 नवम्बर 2015, 11:58

आपको स्ट्रिंग के अंदर name आकार देना होगा। अन्यथा कंपाइलर को पता नहीं है कि संरचना कितनी बड़ी है।

जब एक चर की तरह की घोषणा की

uint8_t myString[] = "Foo";

संकलक आकार को "Foo" के आकार से समझ सकता है, लेकिन यदि आप बिना प्रारंभिक मूल्य के एक सरणी घोषित करते हैं, तो आप को आकार बताना होगा।


(टिप्पणियां सवाल करती हैं कि क्या एक uint8_t सरणी को वास्तव में एक स्ट्रिंग के साथ आरंभ किया जा सकता है। सिस्टम पर जहां char अहस्ताक्षरित है, uint8_t {{के लिए एक टाइपफ़ीड हो सकता है X3 }} । )

2
Bo Persson 16 नवम्बर 2015, 07:38

यदि आप किसी संरचना में अनिश्चित आकार का एक सरणी रखना चाहते हैं, तो यह संरचना का अंतिम तत्व होना चाहिए, और संरचना के लिए स्मृति आवंटित करते समय आपको सरणी सामग्री के लिए अतिरिक्त आवंटित करना होगा।

1
Jasen 15 नवम्बर 2015, 10:39