मैं निम्नलिखित समस्या के बारे में सोच रहा हूं: मैं एक प्रोग्राम के साथ एक माइक्रोक्रोनरोलर (चलिए एक एवीआर मेगा प्रकार) कहना चाहता हूं जो कुछ प्रकार की लुक-अप टेबल का उपयोग करता है।संकलन समय पर जीसीसी मूल्यांकन कार्यों को कैसे बनाया जाए?
पहला प्रयास तालिका को एक अलग फ़ाइल में ढूंढना और इसे किसी अन्य स्क्रिप्टिंग भाषा/प्रोग्राम/का उपयोग करके बनाना होगा .... इस मामले में सी
के लिए आवश्यक स्रोत फ़ाइलों को बनाने में काफी प्रयास किए गए हैं।मेरा विचार अब चीजों को संभालने के लिए प्रीप्रोसेसर और कंपाइलर का उपयोग करना था। मैं साइन मानों की तालिका (सिर्फ एक उदाहरण के रूप में) के साथ इस को लागू करने की कोशिश की:
#include <avr/io.h>
#include <math.h>
#define S1(i,n) ((uint8_t) sin(M_PI*(i)/n*255))
#define S4(i,n) S1(i,n), S1(i+1,n), S1(i+2,n), S1(i+3,n)
uint8_t lut[] = {S4(0,4)};
void main()
{
uint8_t val, i;
for(i=0; i<4; i++)
{
val = lut[i];
}
}
अगर मैं इस कोड संकलन मैं sin
समारोह के बारे में चेतावनी मिलता है। विधानसभा में आगे .data
अनुभाग में कुछ भी नहीं है। अगर मैं तीसरी पंक्ति में sin
हटा देता हूं तो मुझे असेंबली में डेटा मिलता है। स्पष्ट रूप से सभी जानकारी संकलन समय पर उपलब्ध हैं।
क्या आप मुझे बता सकते हैं कि मेरे इरादे को हासिल करने का कोई तरीका है: संकलक ऑफ़लाइन जितना संभव हो उतना मूल्यों की गणना करता है? या तालिका प्रविष्टियों की गणना करने के लिए बाहरी स्क्रिप्ट/प्रोग्राम/... का उपयोग करने का सबसे अच्छा तरीका है और इन्हें एक अलग फ़ाइल में जोड़ें जो केवल #include
डी होगा?
"काफी कुछ प्रयास" लिखने यह एक बार उत्पन्न करने के लिए और बस में पेस्ट कर सकते हैं -। एक अच्छा पटकथा के साथ भाषा? सी के साथ समस्या पर हमला करने से निश्चित रूप से कम .... –
सी ++ 11 (सी ++ 14 के साथ सुधार) संकलन समय पर एक समारोह निष्पादित करने के लिए कंपाइलर के संकेत के रूप में 'constexpr' है। – johannes
@johannes: 'constexpr' का कोई फायदा नहीं है। यह संकलन समय पर केवल एक अभिव्यक्ति का मूल्यांकन किया जा रहा है (और संकलक को इसके लिए भी मजबूर कर रहा है, उदाहरण के लिए एक गणना को असाइन करके इसे उसी स्रोत फ़ाइल में किसी अन्य स्थान पर रनटाइम पर फिर से मूल्यांकन करने से नहीं रोकता है!)। यह कुछ भी लागू या संकेत नहीं करता है। उस ने कहा, मेरा जीसीसी ओपी में कोड स्निपेट को एक संकलित-मूल्यांकन लुकअप टेबल (बिना किसी विशेष विशेष नृत्य के) में ठीक करता है। – Damon