Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过头文件中的宏定义数组_C_Arrays_Macros_Header_Initialization - Fatal编程技术网

C 通过头文件中的宏定义数组

C 通过头文件中的宏定义数组,c,arrays,macros,header,initialization,C,Arrays,Macros,Header,Initialization,我想问一下这个代码 #include <stdio.h> #include "bit-array.h" #ifndef BitArray #define BitArray(array_name, size)\ int size_in_bits = size/sizeof(long);/*thanks to this, it should work on x64*/\ size_in_bits /= 8;/*conversion from bytes to bits*

我想问一下这个代码

#include <stdio.h>
#include "bit-array.h"

#ifndef BitArray
#define BitArray(array_name, size)\
    int size_in_bits = size/sizeof(long);/*thanks to this, it should work on x64*/\
    size_in_bits /= 8;/*conversion from bytes to bits*/\
    int array_name[size_in_bits];/*declaration of an array*/\
    for(int i = 0; i < size_in_bits; i++)/*filling the array by zeros*/\
        array_name[i] = 0;\

#endif

int main()
{
    BitArray(test, 100);
    for(int i = 0; i < 100; i++)
        printf("%d\n", test[i]);
    return 0;
}
#包括
#包括“位数组.h”
#ifndef位数组
#定义位数组(数组名称、大小)\
int size_in_bits=大小/sizeof(长)/*由于这一点,它应该在x64上工作*/\
大小(单位:位)/=8/*从字节到位的转换*/\
int数组_名称[大小(单位:位)]/*数组的声明*/\
对于(int i=0;i
据我所知,这个宏位数组(array_name,size)(放在单独的头文件bit array.h中)应该定义并用零填充数组,然后它应该将零打印到终端中。 但是,它会从内存中打印一些随机数。我被困在这里了。你能帮忙吗

编辑:谢谢你的回答。我必须道歉,我忘了在这里写一件重要的事。这就是事实,在这个任务中,这必须是带有原型的宏:BitArray(数组名称,大小)。

我会使用这个:

#include <limits.h>
#define bit_array(type, varname, nbits) \
    type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。

我将使用以下方法:

#include <limits.h>
#define bit_array(type, varname, nbits) \
    type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。

我将使用以下方法:

#include <limits.h>
#define bit_array(type, varname, nbits) \
    type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。

我将使用以下方法:

#include <limits.h>
#define bit_array(type, varname, nbits) \
    type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]

最好使用无符号整数类型作为数组的基类型。

您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个


但是,这段代码还有其他各种问题…

您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个


但是,这段代码还有其他各种问题…

您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个


但是,这段代码还有其他各种问题…

您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个


这段代码还有很多其他的问题,尽管…

按照您编写宏的方式,您最好将它变成一个函数并将其标记为内联。幸运的是,你不需要那么复杂

Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:

    #include <limits.h>
    #define BitArray( type, varname, nbits ) \
        type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*sizeof(type))]={0};
因此,您的程序成为:

    int main()
    {
        BitArray( uint32_t, test, 100 );  // same as uint32_t test[4] = {0};
        for ( int i = 0; i < 4; i++ )
            printf("%d\n", test[i]);
        return 0;
    }
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}

按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂

Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:

    #include <limits.h>
    #define BitArray( type, varname, nbits ) \
        type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*sizeof(type))]={0};
因此,您的程序成为:

    int main()
    {
        BitArray( uint32_t, test, 100 );  // same as uint32_t test[4] = {0};
        for ( int i = 0; i < 4; i++ )
            printf("%d\n", test[i]);
        return 0;
    }
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}

按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂

Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:

    #include <limits.h>
    #define BitArray( type, varname, nbits ) \
        type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*sizeof(type))]={0};
因此,您的程序成为:

    int main()
    {
        BitArray( uint32_t, test, 100 );  // same as uint32_t test[4] = {0};
        for ( int i = 0; i < 4; i++ )
            printf("%d\n", test[i]);
        return 0;
    }
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}

按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂

Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:

    #include <limits.h>
    #define BitArray( type, varname, nbits ) \
        type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*sizeof(type))]={0};
因此,您的程序成为:

    int main()
    {
        BitArray( uint32_t, test, 100 );  // same as uint32_t test[4] = {0};
        for ( int i = 0; i < 4; i++ )
            printf("%d\n", test[i]);
        return 0;
    }
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}

大小(单位:位)
不是100。并使用
memset
清除memory@KerrekSB:您似乎忘记了可变长度数组、VLA、C99中的标准值和C11中的可选值。@JonathanLeffler:没错,但是OP发布的构造不必要地使用动态绑定,因为绑定是静态可用的。我发布的解决方案仍然可以用于创建VLA。我主要反对中间变量…
size_