MSVC - 表达式必须具有指向对象的指针类型,但它在泛型数组上具有类型 "float"?

MSVC - expression must have pointer-to-object type but it has type "float" on generic array?

MSVC 在 Visual Studio 2019 上说“表达式必须具有指向对象的指针类型,但它在泛型数组上具有类型“float””:

void _stdcall sample::Eff_Render(PWAV32FS SourceBuffer, PWAV32FS DestBuffer, int Length)
{
    float gain = _gain;
    for (int ii = 0; ii < Length; ii++)
    {
        (*DestBuffer)[ii][0] = (*SourceBuffer)[ii][0] * gain;
        (*DestBuffer)[ii][1] = (*SourceBuffer)[ii][1] * gain;
    }
}

问题似乎在这里:

    (*DestBuffer)[ii][0] = (*SourceBuffer)[ii][0] * gain;
    (*DestBuffer)[ii][1] = (*SourceBuffer)[ii][1] * gain;

不知道为什么:

typedef float TWAV32FS[2];
typedef TWAV32FS *PWAV32FS;

要禁用某些标志?在 gcc 上,这种“转换”似乎由编译器自动管理。 管理这个的正确方法是什么? (也许我对 gcc 的理解是错误的,我不知道...)

改变这个:

    (*DestBuffer)[ii][0] = (*SourceBuffer)[ii][0] * gain;
    (*DestBuffer)[ii][1] = (*SourceBuffer)[ii][1] * gain;

为此:

    DestBuffer[ii][0] = (SourceBuffer[ii][0]) * gain;
    DestBuffer[ii][1] = (SourceBuffer[ii][1]) * gain;

解释:

(我猜你正在对立体声信号进行浮点音频处理)。

DestBufferSourceBuffer 都是样本数组。每个样本都是一对浮点数。

每个样本都是这样引用的:

DestBuffer[ii]

示例中的每个单独通道都是这样引用的:

DestBuffer[ii][0]
DestBuffer[ii][1]

您使用此语法时遇到的错误:

(*DestBuffer)[ii][0]

是不是*DestBuffer真的和DestBuffer[0]一样,还是数组中的第一个样本。所以 (*DestBuffer)[ii]DestBuffer[0][ii] 相同,这不是您想要的。但是 (*DestBuffer)[ii][0]DestBuffer[0][ii][0] 相同 - 这会触发编译器错误,因为第三维不存在。

之前已经完成了一些音频处理代码 - 不要忘记适当地用 gain 限制乘法的结果。

由于这些类型定义

typedef float TWAV32FS[2];
typedef TWAV32FS *PWAV32FS;

typedef 名称 PWAV32FS 等同于 float ( * )[2]

所以参数SourceBufferDestBuffer实际上声明为

float ( *SourceBuffer )[2], float ( * DestBuffer )[2]

因此for循环应该重写为

for (int ii = 0; ii < Length; ii++)
{
    DestBuffer[ii][0] = SourceBuffer[ii][0] * gain;
    DestBuffer[ii][1] = SourceBuffer[ii][1] * gain;
}