मैं Arduino और C++ विकास के लिए नया हूं जो C# से आ रहा है, इसलिए संभवत: इतनी मौलिक समझ गायब है। कृपया तदनुसार उत्तर दें।

संदर्भ

मैं एक Arduino स्केच लिख रहा हूं जिससे मैं एक वेब एपीआई से डेटा प्राप्त करने के लिए एक Http GET अनुरोध करता हूं। प्रतिक्रिया प्राप्त करने में, मैं client.read(data,client.available()) का उपयोग करके स्ट्रीम को byte data[] में पढ़ने में सक्षम हूं। मेरे आवेदन में, मुझे पता है कि प्रत्येक byte ASCII एन्कोडिंग में एक char का प्रतिनिधित्व करता है। प्रतिक्रिया को संसाधित करने के लिए, मैं इसे byte[] को char[] में बदलना चाहता हूं, हालांकि इसने मुझे सोचने पर मजबूर कर दिया...

प्रश्न

सी ++ में मैं सामान्य रूप से byte[] को स्मृति की प्रतिलिपि किए बिना किसी अन्य ज्ञात प्रकार में कैसे डाल सकता हूं? सी # में मैं इसे MemoryMarshal का उपयोग करके हासिल करूंगा। कुछ मुझे बताता है कि मुझे किसी ऑब्जेक्ट को पॉइंटर से बस प्रारंभ करने में सक्षम होना चाहिए?

बहुत धन्यवाद

0
George Kerwood 21 अप्रैल 2021, 09:57

1 उत्तर

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

बाइट एक देशी C++ प्रकार नहीं है, Arduino वातावरण इसे typedef, यह वास्तव में एक uint_8 (अहस्ताक्षरित 8 बिट पूर्णांक) प्रकार है। यह भी अंतर्निहित प्रकार का चार है, इसलिए आपको वास्तव में कुछ भी करने की आवश्यकता नहीं है। एक बाइट सरणी और चार सरणी पहले से ही एक ही डेटा प्रकार हैं, उन्हें अलग-अलग लेबल किया गया है।

आप अपने कोड की स्पष्टता को बेहतर बनाने के लिए (char) कास्ट का उपयोग कर सकते हैं, और इससे कोई डेटा कॉपी नहीं होगा।

अपडेट करें:

आप कुछ कच्चे डेटा को एक अलग डेटा प्रकार के रूप में व्याख्या करने के लिए कंपाइलर को बताने के लिए सी या सी ++ में कास्ट का उपयोग कर सकते हैं। नीचे दिए गए उदाहरण में, XYXYXY को व्यवस्थित करने वाले 2D वैक्टर वाले 6 फ़्लोट्स की एक सरणी को 2D वेक्टर संरचनाओं की एक सरणी में डाला गया है। यह बिना किसी डेटा की कॉपी के किया जाता है। हालांकि इस तकनीक के साथ कई नुकसान भी हैं। आपको पूरी तरह से सुनिश्चित होना चाहिए कि संकलक संरचना के अंतर्निहित भंडारण को कैसे बिछा रहा है। यह मानक द्वारा परिभाषित नहीं है इसलिए संकलक के बीच भिन्न हो सकते हैं, कई शब्द संरेखण के लिए पैडिंग जोड़ देंगे जो उपयोग की गई वास्तुकला के आधार पर अलग-अलग होंगे। इसलिए इस विधि का प्रयोग सावधानी से करें।

struct My2DVector {
    float x, y;
}

float flatVectorData[] = { 0.0, 1.0, 2.0, 2.5, -5.0, 3.0};

// Cast the pointer to float to a pointer to My2DVector
My2DVector* structVectorData = (My2DVector*)flatVectorData;

printf("Vector 2 (%f %f)\n", structVectorData[1].x, structVectorData[1].y);
1
PeteBlackerThe3rd 21 अप्रैल 2021, 15:07
1
दिलचस्प है, धन्यवाद, यह मेरे उदाहरण के मामले में निश्चित रूप से सहायक है। हालांकि "प्रश्न" के लिए विशिष्ट, क्या इसके लिए एक सामान्य दृष्टिकोण है? उदाहरण के लिए कल्पना कीजिए कि मेरे पास एक uint_8[6] था जो एक myStruct[2] के बराबर था, प्रत्येक myStruct में uint_8 प्रकार के दो क्षेत्र थे। उस प्रकार के कलाकारों से कैसे संपर्क किया जाता है? फिर से, प्रतियों के बिना। धन्यवाद
 – 
George Kerwood
21 अप्रैल 2021, 14:01
मैंने एक उदाहरण जोड़ा है जो मुझे आशा है कि समझ में आता है
 – 
PeteBlackerThe3rd
21 अप्रैल 2021, 15:08
1
पूर्ण धन्यवाद। यह उतना ही सरल है जितना मैं इसकी उम्मीद कर रहा था, लेकिन किसी कारण से या अन्य को स्पष्ट उत्तर नहीं मिला। मैं स्पष्ट स्मृति प्रबंधन के बिना इन परिचालनों के जोखिमों को भी समझता हूं, इसके लिए धन्यवाद।
 – 
George Kerwood
21 अप्रैल 2021, 15:10