2012-11-30 9 views
5

निम्न कोड संकलित करने में विफल रहता है। त्रुटि संदेश हैं:प्रतिबंधित (amp) फ़ंक्शंस को रोकने के लिए डिफ़ॉल्ट पैरामीटर

त्रुटि 1:

error C3930: 'foo' : no overloaded function has restriction specifiers that are compatible with the ambient context '' 

त्रुटि 2:

error C2660: 'f1' : function does not take 0 arguments 

त्रुटि 3:

IntelliSense: amp-restricted function "int foo() restrict(amp)" (declared at line 5) must be called from an amp-restricted function 

कार्यक्रम:

#include <amp.h> 
#include <iostream> 
using namespace std; 

int foo() restrict(amp) { return 5; } 

int f1(int x = foo()) restrict(amp) { 
    return x; 
} 

int main() 
{ 
    using namespace concurrency; 

    int a[10] = {0}; 
    array_view<int> av(10, a); 

    parallel_for_each(av.extent, [=](index<1> i) restrict(amp) { 
    av[i] = f1(); 
    }); 

    for(unsigned i=0; i<10; ++i) { 
    cout << av[i] << "\n"; 
    } 
    return 0; 
} 

आश्चर्यजनक रूप से, जब मैं foo() पर restrict(amp) को हटाता हूं, और f1() को लैम्ब्डा में कॉल करता हूं, कहता है, 5, प्रोग्राम ठीक से संकलित करता है। तो कार्यों के लिए डिफ़ॉल्ट तर्क में फ़ंक्शन कॉल के नियम क्या हैं?

+0

मुझे जीसीसी और एमएसवीसी दोनों के विचित्र संदेश सामने आए। यह पता चला कि मेरे पास 'MyStruct' की एक सरणी थी, और तत्वों की संख्या एक से बंद थी:' MyStruct s_val [3] = {MyStruct (...), MyStruct (...)}; '। न तो संकलक ने मुझे बताया कि गिनती बंद थी। – jww

उत्तर

2

MSDN Forum answer प्रश्न के लिए।

डिफ़ॉल्ट तर्क हम चुना है के शब्दों के लिए एक कार्यक्रम के लिए एक एक बाएँ से सही पास में किया जाता है की है कि पार्स C++ का व्यापक आधार के साथ, इस नियम के लिए कुछ महत्वपूर्ण अपवाद के होते हुए भी (गठबंधन कर रहे हैं सबसे विशेष रूप से सदस्य फ़ंक्शंस) - इसलिए फ़ंक्शन पैरामीटर घोषणा के बाद प्रतिबंध विनिर्देशक को पढ़ा जाता है, इसलिए डिफ़ॉल्ट तर्क अभिव्यक्तियों में स्थित किसी भी फ़ंक्शन कॉल को "बाहरी" प्रतिबंध विनिर्देश के अनुसार बाध्य किया जाता है, बेहतर या बदतर के लिए। दूसरे शब्दों में, आप सीपीयू-प्रतिबंध "सक्रिय" (क्योंकि यह डिफ़ॉल्ट है) के साथ शुरुआत से प्रोग्राम पढ़ते हैं और प्रासंगिक क्षेत्र को बंद करने के लिए "प्रतिबंधित (एक्स)" और "}" के बीच सब कुछ के लिए प्रतिबंध एक्स पर स्विच करते हैं।

+0

आपको शायद इसे समझा जाना चाहिए। यह मुझे स्पष्ट नहीं है कि आप क्या प्राप्त कर रहे हैं (एमएसडीएन उद्धृत करने के अलावा)। – jww

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