سؤال

أقوم بإعداد فصل مع:

class Example {
    static const float array[3][8];
};

وتنفيذها

inline const float below_center(const float pos) {
    return pos - (size / 2); // size is a const float
}

inline const float above_center(const float pos) {
    return pos + (size / 2);
}

inline const float *set_pos(const float x, const float y) {
    return (float []) {
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    };
}

const float Example::array[3][8] = {
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
};

لكن عندما أفعل هذا ، أحصل على خطأ في قول ، "" const float*"إلى" const float "في التهيئة". أنا أفهم ما يقوله الخطأ ، لكن الجحيم هو أن يقول "const تعويم" وكيف يمكن تنفيذ صفيف بلدي مع وظائف مضمّنة.

هل كانت مفيدة؟

المحلول

لا يمكنك فعل ذلك. استخدم وحدات الماكرو:

#define BELOW_CENTER(pos) ((pos) - (size / 2))
#define ABOVE_CENTER(pos) ((pos) + (size / 2))

#define SET_POS(x, y) {               \
    BELOW_CENTER(x), BELOW_CENTER(y), \
    BELOW_CENTER(x), ABOVE_CENTER(y), \
    ABOVE_CENTER(x), BELOW_CENTER(y), \
    ABOVE_CENTER(x), ABOVE_CENTER(y)  \
}

const float Example::array[3][8] = {
    SET_POS(2.0f, 0.0f),
    SET_POS(-1.0f, -1.0f),
    SET_POS(1.0f, -1.0f),
};

نصائح أخرى

عودتك (float[]) {....} ليس قانونيًا ، لأن المركب الحرفي سوف ينبعث منه صفيف تلقائي ، وأنت تعيد مؤشرًا إلى صفيف تلقائي يتم تدميره إذا ترك تدفق التحكم في هذه الوظيفة. تحصل على مؤشر متدلي.

إنها أيضًا ميزة C99 ، لذا فإن الكود الخاص بك هو C ++/C99 حقًا :)


المشكلة الثانية التي يكتشفها المترجم في وقت الترجمة هي تهيئة الصفيف. هنا، هدفين ينطبق. لأن أ const float* لا يمكن تهيئة أ const float[8], ، المترجم يفترض أن تستعد ويحاول تهيئة العضو الأول array[0][0..7] باستخدام ذلك const float*. هذا لن يعمل أيضًا وينعكس هذا في رسالة الخطأ.

سيتعين عليك ملء هذا الصفيف في وقت التشغيل باستخدام نوع من الحلقة أو سيتعين عليك تحديد القيم الأولية في تهيئة الصفيف المشابهة لكيفية قيامك بذلك في return بيان.


بما أنك تستخدم C ++ و C99 ، لماذا لا تجمع بين الطاقة والاستخدام [boost|tr1]::array?

inline const boost::array<float, 8> set_pos(const float x, const float y) {
    return (boost::array<float, 8>) {{
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    }};
}

const boost::array<boost::array<float, 8>, 3> Example::array = {{
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
}};

احذر أن inline تختلف الدلالات بين C ++ و C99. من الأفضل أن تتأكد من أن الدلالات تنطبق على برنامجك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top