2012-07-01 12 views
9

मैं डायरेक्टएक्स एसडीके में ट्यूटोरियल देख रहा था। ट्यूटोरियल 5 ठीक काम करता है, लेकिन जब मैंने अपनी खुद की कक्षाओं में कोड कॉपी और अलग किया है, तो मुझे अपने आवेदन को लॉन्च करने के दौरान अजीब त्रुटि मिली।m = XMMatrixIdentity() के बाद क्रैश - कक्षाओं में संरेखण स्मृति?

लाइन है:

g_World1 = XMMatrixIdentity(); 
क्योंकि यह की

, मैं xnamathmatrix.int ऑपरेटर में त्रुटि = जो कि तरह लग रहा है मिल गया:

XMFINLINE _XMMATRIX& _XMMATRIX::operator= 
(
    CONST _XMMATRIX& M 
) 
{ 
    r[0] = M.r[0]; 
    r[1] = M.r[1]; 
    r[2] = M.r[2]; 
    r[3] = M.r[3]; 
    return *this; 
} 

और त्रुटि संदेश है:

Access violation reading location 0xffffffff 

मैंने कहीं पढ़ा है कि यह XMFLOAT4X4/XMMATRIX से जुड़े किसी चीज़ के कारण हो सकता है:

क्या आपने मैट्रिक्स को स्टोर करने के लिए XMFLOAT4X4 का उपयोग करने और केवल XMMATRIX का उपयोग करने पर विचार किया है?

लेकिन मुझे लगता है कि मैं पहले से ही एक्सएममैट्रिक्स का उपयोग करता हूं।

MyClass.h:

private: 
    XMMATRIX g_World1; 

MyClass.cpp:

void init(){ 
    g_World1 = XMMatrixIdentity(); 
} 

मुझे नहीं लगता कि मैं XMMATRIX g_World1 बदलना चाहिए है,

त्रुटि C2679: XMFLOAT4X4 g_World1 है, क्योंकि ऐसा लगता है कि त्रुटियों का उत्पादन बाइनरी '=': कोई ऑपरेटर पाया किस प्रकार की 'XMMATRIX' एक दायां संकार्य लेता है (या कोई स्वीकार्य रूपांतरण है)

तो, समस्या क्या है?

उत्तर

5

XMVECTOR और XMMATRIX 'रजिस्टर प्रॉक्सी' प्रकार हैं। आप Xbox 360, Xbox One और Windows x64 प्लेटफ़ॉर्म के प्रकारों के रूप में सुरक्षित रूप से उनका उपयोग कर सकते हैं क्योंकि उनके पास मूल रूप से स्टैक पर डेटा के लिए 16-बाइट संरेखण है और ढेर पर आवंटित किया गया है।

विंडोज 32-बिट या विंडोज आरटी/एआरएम के लिए उनका उपयोग करना अधिक प्रयास करता है क्योंकि देशी संरेखण 16-बाइट से अधिक है। एक दृष्टिकोण डायरेक्टएक्स टूल किट द्वारा उपयोग की जाने वाली तकनीक है ... यह पीआईएमपीएल मुहावरे का उपयोग करता है और पीआईएमपीएल आंतरिक कक्षाओं को 16-बाइट संरेखण के साथ स्पष्ट रूप से आवंटित किया जाता है, जहां एक्सएमवेक्टर और एक्सएममैट्रिक्स प्रकार सीधे उपयोग किए जाते हैं। एक और तरीका XMFLOAT4 और XMFLOAT4X4 जैसे सभी विभिन्न 'स्टोरेज' प्रकारों का उपयोग करना है।

नोट: DirectXMath programmer's guide इसमें शामिल है। यह पढ़ने के लिए एक लंबा दस्तावेज़ नहीं है, और यह बहुत सारे संकेतों और सिफारिशों के साथ पैक किया गया है।

पुनश्च: वहाँ MSDN कोड गैलरी पर Win32 डेस्कटॉप कि DirectX एसडीके की आवश्यकता नहीं है के लिए मानक Direct3D ट्यूटोरियल का एक संस्करण है ... यह सिर्फ का उपयोग करता है विंडोज 8.x एसडीके वी.एस. 2012 या वी.एस. 2013 enter link description here

के साथ शामिल
6

चूंकि XMMATRIX 16-बाइट गठबंधन 4x4 मैट्रिक्स का प्रतिनिधित्व करता है, इसलिए g_World1 के असाइन किए गए आवंटन का उपयोग उल्लंघन उल्लंघन होता है (बस डालें, g_World1 का पता 16 तक विभाजित नहीं है)।

समाधान का क्रमबद्ध करें: 16 बाइट्स (MyClass के लिए g_World1 "रखने के लिए संरचना सदस्य संरेखण सक्षम करें)। लेकिन फिर भी आपको यह सुनिश्चित करना होगा कि MyClass उदाहरण 16 से विभाजित पते पर रहते हैं।

आप MyClass ऑब्जेक्ट्स आवंटित करने के लिए प्लेसमेंट 'नया' ऑपरेटर का उपयोग कर सकते हैं।

संरेखण के बारे में यहाँ देखें: How to align pointer

+0

शायद यह एक बेवकूफ सवाल है लेकिन इसे कैसे प्राप्त करें? मैंने एक स्ट्रक्चर मैट्रिक्स बनाया है जिसमें चार मैट्रिक्स (व्यू, वर्ल्ड इत्यादि) शामिल हैं लेकिन इसके लिए '16 सदस्य' द्वारा संरचना सदस्य संरेखण को कैसे सक्षम किया जाए? – PolGraphic

+0

VStudio के लिए: प्रोजेक्ट गुण -> कॉन्फ़िगरेशन गुण -> सी/सी ++ -> कोड जनरेशन -> स्ट्रक्चर मेमबर संरेखण -> 16 का चयन करें –

+0

जीसीसी के लिए "__attribute__ ((गठबंधन (16))" है "structs –

1

धन्यवाद।

अंततः मैंने XMLoadFloat4x4() और XMStoreFloat4x4() फ़ंक्शंस का उपयोग करने का निर्णय लिया। मैं कक्षा के सदस्यों को Float4x4 के रूप में संग्रहीत करता हूं और उन्हें अस्थायी उपयोग के लिए XMMATRIX प्रत्येक रेंडर() लूप में परिवर्तित करता हूं। लेकिन ... यह एक तेज़ या गूंगा समाधान है?

+1

एक और सवाल शुरू करने पर विचार करें, यह एक चर्चा मंच नहीं है। यदि matrices की संख्या छोटी है तो यह कोई मुद्दा नहीं होगा। –

+0

ऐसा लगता है कि वे बराबर हैं। यदि आप निश्चित रूप से गणना (एलओएल) के लिए एक्सएममैट्रिक्स में परिवर्तित नहीं करते हैं। – Loryan55

+0

यह ठीक है कि आपको संरेखण को संभालने की अपेक्षा की जाती है ... –

1

बुक से "DirectX 11 के साथ 3 डी खेल प्रोग्रामिंग का परिचय" में "फ्रैंक डी लूना" यह कहते हैं:

कक्षा या संरचना के सदस्य के रूप XMMATRIX प्रयोग न करें।हमेशा XMFloat4x4 का उपयोग करें और यदि आपको इसकी आवश्यकता हो तो लोड और स्टोर करें।

संबंधित मुद्दे