определить двумерный константный массив в макросе C - PullRequest
0 голосов
/ 22 января 2019

Я хотел бы загрузить статический массив в память, используемый в качестве ядра свертки в более позднем цикле, в C99 и позже.Я пытался это сделать:

/** This is the outer product of
 * filter[5] = { 1.0f / 16.0f, 4.0f / 16.0f, 6.0f / 16.0f, 4.0f / 16.0f, 1.0f / 16.0f };
 * computed at once, outside of the pixels loops, saving 25 multiplications per pixel
 * */
#define filter[5][5] { {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f}, \
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
                       {0.02343750f, 0.093750f, 0.1406250f, 0.093750f, 0.02343750f}, \
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
                       {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f} }

GCC 8 жалуется:

error: expected expression before « { » token
 #define filter { {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f}, \

Я нашел, как загружать одномерные векторы, но как это сделать с 2D?

Редактировать

Конечная цель состоит в том, чтобы создать из него массив SIMD:

static const __m128 filter_sse[5][5] = { { _mm_set1_ps(filter[0][0]),
                                         ... },
                                           ... };

, и использование static const float filter[5][5] заставляет его жаловаться на попытку установить константу с непостоянные значения.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы не указали = между filter[5][5] и { {.

И, как он есть, filter не может быть именем макроса, поскольку за ним следуют скобки

И вам нужен тип (например, float)

Вот очищенная версия:

#define DEFME float filter[5][5] = { \
    {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f}, \
    {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
    {0.02343750f, 0.093750f, 0.1406250f, 0.093750f, 0.02343750f}, \
    {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
    {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f} }

DEFME;

Примечание: Но,зачем использовать для этого макрос?

0 голосов
/ 22 января 2019

Абстрагируясь от смысла

#include <stdio.h>

#define myfilter(name) name[5][5] = { {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f}, \
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
                       {0.02343750f, 0.093750f, 0.1406250f, 0.093750f, 0.02343750f}, \
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f}, \
                       {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f} }

int main()
{
    const float myfilter(filter1);
    printf("%f\n", filter1[1][1]);

    return 0;
}
0 голосов
/ 22 января 2019

Претензия по поводу пропавшего оператора =:

Попробуйте это:

#define ARRAY filter[5][5] = { {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f},\
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f},\
                       {0.02343750f, 0.093750f, 0.1406250f, 0.093750f, 0.02343750f},\
                       {0.01562500f, 0.062500f, 0.0937500f, 0.062500f, 0.01562500f},\
                       {0.00390625f, 0.015625f, 0.0234375f, 0.015625f, 0.00390625f} };

Позже (например) ...

const float ARRAY;
double a = filter[0][0];  //example assignment using #defined array 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...