【问题标题】:sine-tone generation with sin(double) fills out blocks of memory unexpectedly使用 sin(double) 生成正弦音时意外填满内存块
【发布时间】:2015-01-09 10:25:06
【问题描述】:

我正在用 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);

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

【问题讨论】:

  • dwLength的内容是什么?
  • 更糟糕的是,我回复了一个和我自己一样的主题,并在 C 中给出了一个回复,现在怀疑它是否会起作用。当我回来时,我会搜索它并重新进行验证。

标签: c audio-recording waveform


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可能想要这样的东西:

        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 基础知识。

    【讨论】:

    • 是的,它运行正常,但输出 pcm 有预期的内容。我很抱歉成为一个新手并收到我的主题的缺点,但我希望这个程序能够顺利运行,也许我会在你的帮助下让它运行。另外,请原谅我的英语一开始就不懂 MSalters。我的应用程序需要在 RIFF 文件中编写 Unicode chr$ 以及此 dwLength 代码。该正弦码将存储在文件中,应用程序将查找这些码并返回一个 Unicode 字符。谢谢 M. Waltz
    猜你喜欢
    • 2022-11-18
    • 2019-03-05
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多