मैं डी भाषा (मैं सी ++ में अच्छी तरह से जानते हैं) ... मैं कुछ Windows विशिष्ट सामान करना चाहता हूँ सीख रहा हूँ में एक स्ट्रिंग के लिए एक अस्थायी चरित्र सरणी परिवर्तित तो मैं यह लिखा सिर्फ एपीआई आज़माने के लिए:डी
import core.sys.windows.windows;
import std.stdio;
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(&buffer[0], &size);
return buffer;
}
void main()
{
writeln(name());
}
मैं अपना निवेश बयान में मिलती है:
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
ठीक है, C++ यह निर्माता एक स्ट्रिंग बनाने के लिए कहेंगे। यह अंतर्निहित कहता है इसलिए इसे सी स्टाइल कास्ट के साथ डालने दें: return (string)buffer;
।
test.d(11): Error: C style cast illegal, use cast(string)buffer
आह ठीक है, मुझे याद है, अलग वाक्यविन्यास।
return cast(string)buffer;
अब यह संकलित करता है लेकिन मुझे कचरा मिलता है।
मुझे लगता है कि ऐसा इसलिए है क्योंकि यह स्ट्रिंग में अस्थायी बफर को पॉइंटर संग्रहीत कर रहा है। मैं यह नहीं करना चाहता, मैं पात्रों को एक स्ट्रिंग में कॉपी करना चाहता हूं लेकिन परेशान है कि मुझे यह नहीं लगता कि यह कैसे करना है?
तो सवाल:
मैं एक चार सरणी कि भंडारण ठीक से आवंटित से एक वास्तविक स्ट्रिंग कैसे निर्माण करते हैं? (पात्रों की प्रतिलिपि)
इस तरह के एक यादृच्छिक आकार के बफर को आवंटित करना और स्ट्रिंग में कनवर्ट करना बदसूरत लगता है। क्या डी में ऐसा करने का कोई उचित तरीका है? (मैं सामान्य प्रश्न के बारे में बात कर रहा हूं, विशेष रूप से यह एपीआई नहीं, अगर कंप्यूटर नाम प्राप्त करने के लिए कोई और एपीआई है)।
यदि इनमें से किसी एक को मैनुअल में उत्तर दिया गया है तो मुझे विवरण ढूंढने के लिए कहां देखना चाहिए?
किसी भी मदद और सलाह के लिए धन्यवाद।
आप, 'buffer' के वास्तविक मूल्य की जाँच करने से पहले इसे बदला न गया हो की कोशिश कर सकते हैं क्योंकि रूपांतरण विफल नहीं होना चाहिए। – Bauss
रूपांतरण काम करता है ... अगर मैं इसे फ़ंक्शन में प्रिंट करता हूं ... यदि मैं स्ट्रिंग वापस करता हूं तो यह विफल रहता है, संभवतः क्योंकि यह अभी भी अस्थायी बफर को संदर्भित करता है। – jcoder
@ बास, नहीं, यह नहीं होना चाहिए। वास्तव में 2.068 aborts संकलन के साथ: 'त्रुटि: स्थानीय चर बफर के संदर्भ से बचने। – sigod