gpt4 book ai didi

c - 使用 sin(double) 生成正弦音会意外地填充内存块

转载 作者:行者123 更新时间:2023-11-30 18:55:20 25 4
gpt4 key购买 nike

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

感谢迈克尔·沃尔兹的观察!

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 返回一个指针是有充分理由的。不要将其转换为非指针类型。由于您正在尝试存储 DWORD,因此将其转换为 DWORD*,使用 [i] 选择数组元素并使用 = 赋值运算符。

关于c - 使用 sin(double) 生成正弦音会意外地填充内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com