使用 sin(double) 生成的正弦音意外地填满了内存块
sine-tone generation with sin(double) fills out blocks of memory unexpectedly
我正在用 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 对象和文件的方式可以吗?
memset
不是赋值运算符。另外,GlobalLock
returns 一个有充分理由的指针。不要将其转换为非指针类型。由于您正在尝试存储 DWORD
,因此将其转换为 DWORD*
,select 带有 [i]
的数组元素并使用 =
赋值运算符。
你可能想要这样的东西:
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 基础知识。
我正在用 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 对象和文件的方式可以吗?
memset
不是赋值运算符。另外,GlobalLock
returns 一个有充分理由的指针。不要将其转换为非指针类型。由于您正在尝试存储 DWORD
,因此将其转换为 DWORD*
,select 带有 [i]
的数组元素并使用 =
赋值运算符。
你可能想要这样的东西:
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 基础知识。