मुझे एक अजीब स्थिति है। मैं अपने कैमरा प्रबंधन सॉफ्टवेयर में 10+ साल पुराना पीसीआई कैमरा डिवाइस एसडीके लागू करने की कोशिश कर रहा हूं। मैनिफैक्चरर अब व्यवसाय में नहीं है और मुझे आधिकारिक सहायता पाने का कोई मौका नहीं है। तो मैं यहां हूं, मेरी बदसूरत समस्या में कुछ मदद की तलाश में हूं।विजुअल स्टूडियो संस्करणों के बीच अलग-अलग मेमोरी व्यवहार
एसडीके Visual Studio 6.0
नमूने के साथ आता है। फ़ाइलों में से एक में एक संरचना है जो नीचे की तरह एक बाइट सरणी के साथ समाप्त होती है;
typedef struct AVData {
...
BYTE audioVideoData[1];
}AVDATA, *PAVDATA;
लेकिन यह एक बाइट आवंटित बाइट सरणी के लिए पर्याप्त वीडियो फ्रेम और अजीब प्राप्त करता है, यह विजुअल स्टूडियो 6.0 संस्करण के साथ ठीक काम करता है। अगर मैं इसे विजुअल स्टूडियो 2005/2008/2010 के साथ आज़माता हूं, तो मुझे Memory Access Violation
त्रुटि संदेश मिलना शुरू हो जाता है जो वास्तव में समझ में आता है क्योंकि बाद में एक निश्चित आकार सरणी में स्थान आवंटित करना संभव नहीं है, नहीं? लेकिन वीएस 6.0 के साथ एक ही कोड ठीक चलाता है ?! यह शायद कंपाइलर या सी ++ रनटाइम मतभेदों के कारण होता है लेकिन मुझे इस विषय पर बहुत अनुभवी नहीं है, इसलिए मेरे लिए कुछ कारण बता देना मुश्किल है।
मैंने आकार को आकार की अधिकतम अपेक्षित बाइट्स में बदलने की कोशिश की;
typedef struct AVData {
...
BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;
यह काम कर पाने लेकिन समय-समय पर मैं जब पुस्तकालय की डिकोडर वस्तु नष्ट करने की कोशिश स्मृति पहुँच उल्लंघन समस्याओं पाने में मदद की।
इसमें कुछ निश्चित रूप से गलत है। मेरे पास एसडीके के स्रोत कोड नहीं हैं, केवल डीएलएल, लिब और हेडर फाइलें हैं। मेरे प्रश्न हैं:
1) क्या यह विजुअल स्टूडियो 6.0 संस्करण में एक निश्चित आकार सरणी में स्थान आवंटित करने के लिए वास्तव में कानूनी है?
2) क्या कोई भी संभावित तरीका (एक कंपाइलर विकल्प इत्यादि) है जो एक ही कोड को नए वीएस संस्करण/सी ++ रनटाइम्स के साथ काम करने के लिए करता है?
3) चूंकि हेडर फ़ाइल को संपादित करने का मेरा कामकाज एक बिंदु तक काम करता है लेकिन अभी भी समस्याएं हैं, तो क्या आप इस समस्या को हल करने के लिए कोई बेहतर तरीका जानते हैं?
मुझे लगता है कि समस्या कहीं और होनी चाहिए। सरणी का आकार यहां कोई समस्या नहीं होनी चाहिए, यह ऊपरी बाध्य होने का इरादा नहीं है। – BlueWanderer
इसे एक लचीला सरणी कहा जाता है: http://stackoverflow.com/questions/5478706/flexible-array-member-c99-inside-a- संरचना –
लेकिन फिर हमें मेमोरी एक्सेस उल्लंघन क्यों मिलता है? अगर मैं इस संरचना से एक नई वस्तु बना देता हूं, तो इसे 1 (+ संरचना संरचनाओं के बाकी हिस्सों) के आकार के साथ नहीं बनाया जाएगा? तो, हम बाद में ऑडियोविडियोडाटा सरणी में एक से अधिक बाइट कैसे स्टोर कर सकते हैं? क्या एक निश्चित आकार सरणी में स्मृति को पुन: आवंटित करना संभव है? चूंकि यह वीएस 6.0 संस्करण के साथ काम करता है, यह पहले संभव हो सकता है लेकिन वीएस 2005+ के बारे में क्या? –