मेरे लिए 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 [] है।
मुझे यहाँ क्या याद आ रहा है दोस्तों?
3 जवाब
uint8_t name[];
आपने यहां आकार का उल्लेख नहीं किया है, या तो name
के आकार का उल्लेख किया है। आप अपनी संरचना के मध्य में अज्ञात आकार की सरणी नहीं बना सकते।
uint8_t name[50]; // this could do
और आप इसे इस तरह से शुरू कर सकते हैं -
player p1={.name="hello"};
या memcpy
का उपयोग करें।
आपको स्ट्रिंग के अंदर name
आकार देना होगा। अन्यथा कंपाइलर को पता नहीं है कि संरचना कितनी बड़ी है।
जब एक चर की तरह की घोषणा की
uint8_t myString[] = "Foo";
संकलक आकार को "Foo"
के आकार से समझ सकता है, लेकिन यदि आप बिना प्रारंभिक मूल्य के एक सरणी घोषित करते हैं, तो आप को आकार बताना होगा।
(टिप्पणियां सवाल करती हैं कि क्या एक uint8_t
सरणी को वास्तव में एक स्ट्रिंग के साथ आरंभ किया जा सकता है। सिस्टम पर जहां char
अहस्ताक्षरित है, uint8_t
{{के लिए एक टाइपफ़ीड हो सकता है X3 }} । )
यदि आप किसी संरचना में अनिश्चित आकार का एक सरणी रखना चाहते हैं, तो यह संरचना का अंतिम तत्व होना चाहिए, और संरचना के लिए स्मृति आवंटित करते समय आपको सरणी सामग्री के लिए अतिरिक्त आवंटित करना होगा।