Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Header Files - Fatal编程技术网

如何在C头文件中指定特定的数组大小

如何在C头文件中指定特定的数组大小,c,arrays,header-files,C,Arrays,Header Files,我在头文件中定义了一个名为a的常量;它总是一个偶数 我想在同一头文件中声明一个数组B,其长度取决于A的值 比如, 如果A是32,我希望数组大小是4,(2,4,8,16是元素,直到A/2的所有幂都是2) 如果A是48,我希望数组大小是5,(2,4,8,16,24是元素,所有2的幂直到A/2,最后一个元素是A/2) 使用上述逻辑计算给定a值的B数组大小的优雅方法是什么?也许我遗漏了什么。为什么不简单地将数组定义为: int array[] = { 2,4,8,16 #if A == 48

我在头文件中定义了一个名为a的常量;它总是一个偶数

我想在同一头文件中声明一个数组B,其长度取决于A的值

比如,

如果A是32,我希望数组大小是4,(2,4,8,16是元素,直到A/2的所有幂都是2)

如果A是48,我希望数组大小是5,(2,4,8,16,24是元素,所有2的幂直到A/2,最后一个元素是A/2)


使用上述逻辑计算给定a值的B数组大小的优雅方法是什么?

也许我遗漏了什么。为什么不简单地将数组定义为:

int array[] = {
   2,4,8,16
#if A == 48
   ,24
#endif
};

#define DIM_OF_ARRAY (sizeof(array)/sizeof(array[0]))
对于
a
,您需要使用
#define
,但如果您这样做,您可以使用以下方案进行管理:

#define A 384

#define B_SIZE (A <= 16 ? 3 : A <= 32 ? 4 : A <= 64 ? 5 : A <= 128 ? 6 : \
                A <= 256 ? 7 : A <= 512 ? 8 : A <= 1024 ? 9 : -1)

extern int B[B_SIZE];
这不优雅,但我不确定有没有更整洁的方法来做。这将再次显式使用
B_SIZE
,以确保在
a
的值超出范围时再次出现编译错误。否则,您可以将
B_大小
保留在数组规范之外


您可以很容易地编写一个shell(Awk、Perl、Python等)脚本来生成给定大小的代码。

如果我们可以将
a
限制为2的幂,那么这与另一个问题有关:“如何在编译时计算整数类型中的值位数?”十多年前,Hallvard B Furuseth完美地解决了这个问题。见:

使用Hallvard的解决方案,我们可以计算数组大小,如下所示:

#include <stdio.h>

/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))

#define A 1073741824

int B[IMAX_BITS(A/2-1)];

int main (void)
{
  printf ("%d\n", (int)(sizeof B / sizeof B[0]));
  return 0;
}
#包括

/*inttype_MAX或任何(1)为什么必须静态声明数组。这听起来像是需要计算和动态分配的事情。我希望在头中声明数组,因为我将在多个c文件中使用它。您可以在一个模块中定义它,并使用“extern”@OmerEldan导出它。您能举个例子并将其作为答案发布吗我认为数组需要是floor(log2(A-1))。将其表示为编译时可计算的常量值并不容易。但请注意,这应该在C源文件中以这种方式定义。头文件应该只包含
int-array[]
。很有趣,但不是那么相关,因为问题明确提到,
A
可以有值48,这不是2的幂。@JonathanLeffler:Dang,我错过了那部分。实际上我读了,但忘了它。在回答中重新表述了假设。
#include <stdio.h>

/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))

#define A 1073741824

int B[IMAX_BITS(A/2-1)];

int main (void)
{
  printf ("%d\n", (int)(sizeof B / sizeof B[0]));
  return 0;
}