Home > Software design >  MSVC - expression must have pointer-to-object type but it has type "float" on generic arra
MSVC - expression must have pointer-to-object type but it has type "float" on generic arra

Time:05-16

MSVC on Visual Studio 2019 says "expression must have pointer-to-object type but it has type "float" on generic array" here:

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;
    }
}

the problem seems here:

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

Not sure why:

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

Some flag to be disabled? On gcc this kind of "cast" seems auto-manage by the compiler. What's the correct way to manage this? (maybe I'm wrong on gcc and didn't know...)

CodePudding user response:

Change this:

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

To this:

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

Explanation:

(I'm guessing you are doing audio processing of a stereo signal in floating point).

DestBuffer and SourceBuffer are both arrays of samples. Each sample is a pair of floats.

Each sample is referenced like this:

DestBuffer[ii]

Each individual channel on a sample is referenced like this:

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

The error you have with this syntax:

(*DestBuffer)[ii][0]

Is that *DestBuffer is really the same as DestBuffer[0], or the first sample in the array. So (*DestBuffer)[ii] is the same as DestBuffer[0][ii] which is not what you want anyway. But (*DestBuffer)[ii][0] is the same as DestBuffer[0][ii][0] - which triggers the compiler error because that third dimension does not exist.

Having done some audio processing code before - don't forget to clamp the result of your multiplication with gain as appropriate.

CodePudding user response:

Due to these typedefs

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

the typedef name PWAV32FS is equivalent to float ( * )[2].

So the parameters SourceBuffer and DestBuffer actually are declared like

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

Thus the for loop should be rewritten like

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