带有sin(双)的正弦音生成意外地填充了内存块

时间:2015-01-09 10:25:06

标签: c audio-recording waveform

我正在用c编写一个输出文件中数据的代码。代码生成(幅度)功能尚未明确定义。在编译它运行正常但输出不是我所期望的。即使使用dwVal=0,输出也是相同的:一串上升值而不是正弦值。

long dwData=200;
HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength);
int wData=(int)GlobalLock(hData);//no cast to (int)

    for(int i=0;i<dwLength;i++){
        DWORD dwVal=16384*sin((double)i/20*pi);
        memset(&wData+i, dwVal, 2);
    };

//save data
    if (!PathFileExists(szName1))
        strcpy(szName1, "output.pcm");

FILE* file=fopen(szName1, "wb");
    for(i=0;i<dwLength;i++){
        DWORD j=fputc((int)&wData+i, file);
        if (j==EOF){
            cvar.mbsz("error writing", "titlu", j);
            return;
        };
    };
    fclose(file);

请帮我澄清第一部分(正弦代)的错误以及它应该是什么样子。非常感谢你的时间。

修改

int *wData=(int*)GlobalLock(hData);//no cast to (int)

DWORD dwVal;
    for(int i=0;i<dwLength;i++){
        dwVal=16384*sin(pi/20*(long)i);
        wData[i]=dwVal;
    };

FILE* file=fopen(szName1, "wb");
DWORD j;
    for(i=0;i<dwLength;i++){
        j=fwrite(&wData[i], 1, 1, file);
        if (j==EOF){
            return;
        };
    };
    fclose(file);

谢谢MSalters。我试图在这里和那里做一些替换,但不能说它编译。我是C ++中的新手,我需要用C ++ ...你能为我写下for循环吗?如果您同意我的意见,则dwVal变量不必是数组。 dwLength是一个有限长度(200)。

感谢Michael Waltz的观察!

double pi=3.1415926535;
long dwData=200;
HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength);
long *wData=(long*)GlobalLock(hData);

long dwVal;
    for(int i=0;i<dwLength;i++){
        dwVal=16384*sin(i/20*pi);
        wData[i]=dwVal;
    };

//save data
    if (!PathFileExists(szName1))
        strcpy(szName1, "output.pcm");

FILE* file=fopen(szName1, "wb");
    for(i=0;i<dwLength;i++){
        DWORD j=fwrite(&wData[i], 2, 1, file);
        if (j==EOF){
            cvar.mbsz("error writing", "titlu", 0);
            return;
        };
    };
    fclose(file);

我关闭&释放对象和文件的方式还可以吗?

2 个答案:

答案 0 :(得分:2)

memset不是赋值运算符。另外,GlobalLock返回一个有充分理由的指针。不要将其强制转换为非指针类型。由于您要存储DWORD,请将其转换为DWORD*,使用[i]选择数组元素并使用=赋值运算符。

答案 1 :(得分:0)

你可能想要这样的东西:

    DWORD dwLength = 200 ;
    HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength);

    int *wData=(int*)GlobalLock(hData);

    for(int i = 0;i < dwLength; i++){
        wData[i] = 16384 * sin( (double)i / 20 * PI );
    }

在继续之前,你应该学习一些C基础知识。