代码之家  ›  专栏  ›  技术社区  ›  Aurélien Pierre

在C宏中定义二维常量数组

  •  1
  • Aurélien Pierre  · 技术社区  · 6 年前

    我想在内存中加载一个静态数组,在稍后的循环、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}, \
    

    我已经找到了如何加载一维向量,但是如何使用二维向量呢?

    编辑

    最终目标是从中构建一个SIMD阵列:

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

    并使用 static const float filter[5][5] 使它抱怨试图用非常量值设置常量。

    3 回复  |  直到 6 年前
        1
  •  4
  •   Craig Estey    6 年前

    你忘了 = 之间 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;
    

    边注: 但是,为什么要使用宏?

        2
  •  2
  •   0___________    6 年前

    从它的意义上抽象出来

    #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;
    }
    
        3
  •  1
  •   ryyker    6 年前

    投诉是关于失踪的 = 操作员:

    试试这个:

    #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