1

使用.wav文件... *ptr_8 和 *ptr_16 - 指向样本数组的指针。

我想让程序根据标头的数据声明这些指针(如果 8 bitsPerSample ---> 声明 *ptr_8 ...)

if ( hdr.S1.BitsPerSample == 8 )        // Declaring array for samples. Depending
                                        // on header's data (8 or 16 bits).
    unsigned char *ptr_8;
else
    if ( hdr.S1.BitsPerSample == 16 )
        unsigned short *ptr_16;

问题是它写道:

error: expected expression before 'unsigned'

到这两行(必须声明*ptr_8和声明的地方*ptr_16),尽管我看不到这种行为的原因。请告诉我有什么问题。


更新:

事实证明,声明是一个编译时概念(见下面接受的答案)。

编译时已经声明了变量,因此它需要机器的资源一次,然后(当您编译应用程序时)它们都已经在那里声明了。这意味着这是尝试优化程序的最糟糕的方法之一......

4

2 回答 2

5

您不能根据运行时条件有条件地声明变量:必须无条件地声明两个变量,即使其余代码将只使用其中一个。

使声明有条件的唯一方法是使用预处理器的条件编译,这看起来并不适用,因为您的条件是基于文件的头的,所以它显然是运行时的。

您可以将处理放在 的两个分支中if,如下所示:

if (hdr.S1.BitsPerSample == 16) {
    unsigned short *ptr_16;
    // Use ptr_16 here
} else if (hdr.S1.BitsPerSample == 8) {
    unsigned char *ptr_8;
    // Use ptr_8 here
}
// Neither ptr_16 nor ptr_8 is available here
于 2013-05-15T15:09:17.027 回答
1

为什么你不能只声明两个指针,然后只填充你想要使用的那个?无论如何,问题与范围有关 - 如果您想在 if 块中声明变量,它需要有花括号,然后变量仅在该大括号块中有效。

于 2013-05-15T15:10:32.180 回答