14

वीएस2012 के साथ संकलन और डायरेक्टएक्समैथ लाइब्रेरी के साथ काम करने के लिए, मुझे एक समस्या का सामना करना पड़ा जहां यह दिखाई दिया कि संकलक मेरे एक्सएममैट्रिक्स को संरेखित नहीं कर रहा था। मैंने इस मुद्दे को निम्नलिखित में सरल बना दिया।ऑटो कीवर्ड का उपयोग करते समय संरेखण 16 का सम्मान नहीं किया गया?

#include <DirectXMath.h> 
using namespace DirectX; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto m1 = XMMatrixIdentity(); 
    auto m2 = XMMatrixIdentity(); 

    auto t1 = XMMatrixTranspose(m1); // sometimes access violation occurs here 
    auto t2 = XMMatrixTranspose(m2); // or sometimes here 

    return 0; 
} 

फिर से चल रहा है अधिक से अधिक कोड कभी कभी, एक "पहुँच उल्लंघन पढ़ने स्थान 0xFFFFFFFF" पहले पक्षांतरित पर कारण होगा कभी कभी दूसरे पर।

मुझे पता चला है कि यह इस तथ्य के कारण है कि एम 1 और एम 2 ठीक तरह से गठबंधन नहीं किए जा रहे हैं। "XMMATRIX" के साथ "ऑटो" को प्रतिस्थापित करने से समस्या हल हो रही है, इसलिए मेरा संदेह एक कंपाइलर बग है, लेकिन यह भी संभव है कि मैं कुछ गलत कर रहा हूं, या कुछ विकल्प सक्षम नहीं कर रहा हूं।

क्या मेरे कोड में कुछ गड़बड़ है या यह एक कंपाइलर बग है?

+0

आप किसी भी मतभेद की जांच करने के परिणामस्वरूप विधानसभा पर एक नज़र किया है? –

+0

@ जेएन। हां, अगर मैं "ऑटो" का उपयोग नहीं करता हूं तो इसमें निश्चित रूप से अतिरिक्त निर्देश हैं जो एएसपी के साथ खराब हो जाते हैं और (मुझे लगता है) यह सुनिश्चित करने में मदद करता है कि दो एक्सएमएमएटीआरएक्स ठीक से गठबंधन हैं। – MerickOWA

+0

ठीक है, जब तक कि 'XMMATRIX' एक मैक्रो नहीं है, मैं एक कंपाइलर बग के लिए वोट देता हूं। यदि यह एक मैक्रो है तो यह एक डीएक्स बग हो सकता है ... –

उत्तर

3

XMMATRIX की परिभाषा हेडर फ़ाइल (xnamath.h) में निम्न है, हालांकि यह आपके संस्करण में भिन्न हो सकती है।

// Matrix type: Sixteen 32 bit floating point components aligned on a 
// 16 byte boundary and mapped to four hardware vector registers 
#if (defined(_XM_X86_) || defined(_XM_X64_)) && defined(_XM_NO_INTRINSICS_) 
typedef struct _XMMATRIX 
#else 
typedef _DECLSPEC_ALIGN_16_ struct _XMMATRIX 
#endif 

तो XMMATRIX__declspec(align(16)) साथ परिभाषित किया गया है, जो एक माइक्रोसॉफ्ट विशिष्ट विस्तार है (यदि आप हेडर फाइल यह इस को कम करता है के माध्यम से देखने के लिए)। यह एक मैक्रो नहीं है। इसका मतलब है कि यह एक कंपाइलर बग है, संकलक auto कीवर्ड के साथ परिभाषित चर के लिए इन स्वामित्व विशेषताओं को प्रसारित करने में विफल रहा है।

इस मामले में auto कीवर्ड के उपयोग से बचने के लिए शायद सबसे अच्छा है, यह संभवतः declspec को स्पष्ट रूप से जोड़ने से बेहतर है।

2

यह निश्चित रूप से एक कंपाइलर बग है। मैं इसे अपने गणित वर्गों के साथ भी पुन: उत्पन्न कर सकता हूं। मैंने टिकट here खोला है, इसलिए इसके लिए वोट दें। जैसा कि बताया गया था, आप ऑटो कीवर्ड का उपयोग करने से बच सकते हैं। या आप x64 को संकलित कर सकते हैं जहां बग मौजूद नहीं है (या कम से कम मैं इसे पुन: उत्पन्न करने में असमर्थ था; मेरा इतना आसान प्रोग्राम पूरी तरह से काम नहीं करता है)।

+0

में तय किया गया है यह पहले ही जोड़ा गया था माइक्रोसॉफ्ट कनेक्ट करने के लिए। माइक्रोसॉफ्ट का कहना है कि सी ++ की अगली रिलीज में तय किया जाएगा https://connect.microsoft.com/VisualStudio/feedback/details/761026/xmmatrix-not-properly-aligned-when-using-c-11-auto-keyword – MerickOWA

+0

Glad सुनने के लिए। अगले सीटीपी की प्रतीक्षा कर रहा है ... –

+0

ऐसा लगता है कि यह अभी भी VS2012 पर तय नहीं है। – Trax

0

Visual Studio 2012 के लिए, मैं एक "काम के आसपास" बयान विभाजित करके दो पंक्तियों में लागू करने के लिए यह कर रहा था:

XMMATRIX mtxMyWorldTrnspd = mtxMyWorld; 
mtxMyWorldTrnspd = XMMatrixTranspose(mtxMyWorldTrnspd); 
+0

हां में तय किया गया है, मैंने अपने प्रश्न में उल्लेख किया है। – MerickOWA