मैं Arduino और C++ विकास के लिए नया हूं जो C# से आ रहा है, इसलिए संभवत: इतनी मौलिक समझ गायब है। कृपया तदनुसार उत्तर दें।
संदर्भ
मैं एक Arduino स्केच लिख रहा हूं जिससे मैं एक वेब एपीआई से डेटा प्राप्त करने के लिए एक Http GET अनुरोध करता हूं। प्रतिक्रिया प्राप्त करने में, मैं client.read(data,client.available())
का उपयोग करके स्ट्रीम को byte data[]
में पढ़ने में सक्षम हूं। मेरे आवेदन में, मुझे पता है कि प्रत्येक byte
ASCII एन्कोडिंग में एक char
का प्रतिनिधित्व करता है। प्रतिक्रिया को संसाधित करने के लिए, मैं इसे byte[]
को char[]
में बदलना चाहता हूं, हालांकि इसने मुझे सोचने पर मजबूर कर दिया...
प्रश्न
सी ++ में मैं सामान्य रूप से byte[]
को स्मृति की प्रतिलिपि किए बिना किसी अन्य ज्ञात प्रकार में कैसे डाल सकता हूं? सी # में मैं इसे MemoryMarshal
का उपयोग करके हासिल करूंगा। कुछ मुझे बताता है कि मुझे किसी ऑब्जेक्ट को पॉइंटर से बस प्रारंभ करने में सक्षम होना चाहिए?
बहुत धन्यवाद
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);
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
uint_8[6]
था जो एकmyStruct[2]
के बराबर था, प्रत्येकmyStruct
मेंuint_8
प्रकार के दो क्षेत्र थे। उस प्रकार के कलाकारों से कैसे संपर्क किया जाता है? फिर से, प्रतियों के बिना। धन्यवाद