यह स्थिर uint8_t सरणी के लिए इनपुट प्रक्रिया और प्रकार से एक एक्सटेंशन है< /a> सुझाए गए समाधान से अनुभव की गई समस्याओं के संबंध में।

वर्तमान में, मैं एक int वैरिएबल और एक string वेरिएबल बनाने की कोशिश कर रहा हूं, जिसे static uint8_t array में इनपुट किया गया है और फिर Serial.println का उपयोग करके प्रिंट किया गया है।

मैं उपयोग कर रहा हूँ:

#include <U8x8lib.h>

इंट वेरिएबल कोड (त्रुटि है):

int world = 1;
static uint8_t hello[sizeof(world)];
memcpy(hello, &world, sizeof(hello));

अगर मैं इसे सीधे कॉपी करता हूं और इसे loop() या setup() दोनों के बाहर IDE में पेस्ट करता हूं, तो मुझे निम्न त्रुटि मिलती है:

    memcpy(hello, &world, sizeof(hello));
       ^
exit status 1
expected constructor, destructor, or type conversion before '(' token

इस मुद्दे के बारे में कुछ पढ़ने के बाद, मैंने पाया कि इसे loop() में रखा जाना चाहिए, इसलिए मैंने किया। नतीजा यह था कि संकलन और अपलोड करते समय कोई समस्या नहीं थी, हालांकि जब मैंने लाइन जोड़ा तो यह मूल्य 1073488876 प्रिंट कर रहा था:

Serial.println(int((uint8_t*)hello));

मैंने भी किया:

Serial.println(sizeof(hello));

और इसने 4 मुद्रित किया, जिसका अर्थ है कि कोड एक इंट के रूप में "हैलो" चर का पता लगा रहा है (जैसा कि एक इंट 4 बाइट्स है)।

दिलचस्प रूप से पर्याप्त है, अगर मैं memcpy लाइन पर टिप्पणी करता हूं तो मुझे वही परिणाम मिलता है, जो 1073488876 है, इसलिए कोड किसी भी तरह loop() फ़ंक्शन में रखे जाने पर लाइन को "अनदेखा" कर रहा है।

स्ट्रिंग वेरिएबल कोड

String world = "Hello"; // 6 chars including \0
static uint8_t hello[6];
world.toCharArray((char *)hello, sizeof(hello));

अगर मैं इसे सीधे कॉपी करता हूं और इसे loop() या setup() दोनों के बाहर IDE में पेस्ट करता हूं, तो मुझे निम्न त्रुटि मिलती है:

 world.toCharArray((char *)hello, sizeof(hello));
 ^
exit status 1
'world' does not name a type

अगर मैं लाइन world.toCharArray((char *)hello, sizeof(hello)); को loop() में डालता हूं, तो यह काम करता है।

सीरियल प्रिंट लाइन के साथ भी काम करता है:

  Serial.println(String((char *)hello));

मुझे नहीं पता कि इसका इंट वेरिएबल कोड के साथ मेरे मुद्दे से कोई संबंध है, लेकिन सोचा कि मैं इसे भी दिखा सकता हूं।

0
Lachlan Etherton 14 सितंबर 2018, 12:02

1 उत्तर

सबसे बढ़िया उत्तर

अगर मैं इसे सीधे कॉपी करता हूं और इसे लूप () या सेटअप () दोनों के बाहर आईडीई में पेस्ट करता हूं, तो मुझे निम्न त्रुटि मिलती है:

कार्यों के बाहर की जगह का उपयोग कार्यों, चर और कक्षाओं की घोषणा के लिए किया जा सकता है लेकिन कोड के निष्पादन के लिए नहीं, इसे कार्यों के अंदर जाना है। loop() और setup() मुख्य फ़ंक्शन से बुलाए गए फ़ंक्शन हैं, यही कारण है कि यह काम करता है और उनके बाहर काम नहीं करता है।

जब मैंने लाइन जोड़ी तो यह 1073488876 मान प्रिंट कर रहा था:

hello को एक सरणी hello[sizeof(int)] के रूप में घोषित किया गया था। Arrays में पॉइंटर को उसके पहले तत्व में क्षय करने की प्रवृत्ति होती है। जब आप (uint8_t *)hello को फंक्शनल कास्ट एक्सप्रेशन int(...) और सरणी hello को सूचक को उसके पहले तत्व में स्पष्ट रूप से (uint8_t *) कास्टिंग के साथ परिवर्तित करना, यह आपके लिए स्वचालित रूप से किया जा सकता था। int(hello) या int((uint8_t *)hello) मूल रूप से एक ही हैं। int(...) एक कास्ट है, जैसा कि ऊपर बताया गया है, जो आपके पॉइंटर uint8_t * को int में बदल देता है, इसलिए आपको जो मान दिखाई देता है, वह int के रूप में प्रस्तुत किए गए पहले तत्व का मेमोरी एड्रेस है।

यदि आप println को 1 प्रिंट करना चाहते हैं तो आप बाइट्स की सरणी को वापस int में बदल सकते हैं जैसे आपने इसे सरणी में परिवर्तित किया है:

int world = 1;
static uint8_t hello[sizeof(world)];
memcpy(hello, &world, sizeof(hello));

//convert back
int world2;
memcpy(&world2, hello, sizeof(world2));

//print
Serial.println(world2);
1
Killzone Kid 14 सितंबर 2018, 23:45