2015-01-09 29 views
-1

我正在编写一个代码输出文件中的数据。代码生成(幅度)函数尚未定义好。在编译时,它运行正常,但输出不是我所期望的。即使使用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++中的一个newby,我需要它在C++中...可以为我写下for循环。如果你同意我的观点,dwVal变量不一定是数组。 dwLength是一个有限长度(200)。

谢谢你的观察迈克尔华尔兹!

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

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

+0

'dwLength'的内容是什么? –

+0

更糟糕的是,我回答了一个话题,就像我自己的一样,在C中给了一个回复,现在怀疑它会起作用。当我回来时,我会搜索它并重新进行验证。 – paul

回答

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

+0

是的,它运行正常,但输出pcm有预期的内容。对于我的主题,我很抱歉成为新手和接受缺点,但我希望这个程序能够顺利运行,也许我会在你的帮助下运行它。另外,请原谅我的英文不理解MSalters。我的应用程序需要在RIFF文件中写入Unicode chr $以及dwLength的这段代码。这个正弦代码将存储在文件中,应用程序将查找这些代码并返回一个Unicode字符。谢谢M.华尔兹 – paul

2

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