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;
解释:
(我猜你正在对立体声信号进行浮点音频处理)。
DestBuffer
和 SourceBuffer
都是样本数组。每个样本都是一对浮点数。
每个样本都是这样引用的:
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]
。
所以参数SourceBuffer
和DestBuffer
实际上声明为
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;
}
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;
解释:
(我猜你正在对立体声信号进行浮点音频处理)。
DestBuffer
和 SourceBuffer
都是样本数组。每个样本都是一对浮点数。
每个样本都是这样引用的:
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]
。
所以参数SourceBuffer
和DestBuffer
实际上声明为
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;
}