-3

我的操作系统是窗口,我想将我的数据写入一个 16 位的 pcm。这是我的代码:

typedef unsigned short uint16;
void write2PCM(char* file_path, int length, double* data) {
FILE* file=NULL;
file = fopen(file_path, "wb+");
for (int i = 0; i < length; i++) {
    uint16 val=data[i]*10000;
    uint16 fin_val = (val >> 8 & 0x00ff) | (val << 8 & 0xff00);
    fwrite(fin_val,sizeof(fin_val),1,file);
}

fclose;}

当我调用它时,我在 fwrite 的地方得到了错误:“读取位置 0x 时发生访问冲突......”,我可以看到文件已成功创建,所以我不知道为什么会发生此错误.

4

2 回答 2

3

你真的没有得到任何诊断?C 编译器发出的每一个警告都很重要,它们通常是严重错误的迹象!此外,当您在 Stack Overflow 上提问时,请将编译器中的任何诊断信息逐字复制到问题中。

问题在这里:

fwrite(fin_val, sizeof(fin_val), 1, file);

的原型fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

第一个参数必须是指向 const void 的指针,但您传入的是uint16_t. 它应该是&fin_val,以便fwrite获取该变量的地址。

在相关说明中,fclose;is 不是函数调用,这也应该在任何理智的编译器中产生诊断消息。应该是fclose(file);

这是 GCC 的示例输出,没有警告:

% gcc -c pcm.c
pcm.c: In function ‘write2PCM’:
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
             cast [-Wint-conversion]
     fwrite(fin_val,sizeof(fin_val),1,file);
            ^~~~~~~

并在此处启用所有警告:

% gcc -c pcm.c -Wall
pcm.c: In function ‘write2PCM’:
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
             cast [-Wint-conversion]
     fwrite(fin_val,sizeof(fin_val),1,file);
            ^~~~~~~
In file included from pcm.c:1:0:
/usr/include/stdio.h:717:15: note: expected ‘const void * restrict’ but argument is of 
             type ‘uint16 {aka short unsigned int}’
 extern size_t fwrite (const void *__restrict __ptr, size_t __size,
               ^~~~~~
pcm.c:13:1: warning: statement with no effect [-Wunused-value]
 fclose;}
 ^~~~~~
于 2017-07-27T08:26:01.297 回答
0

fwrite需要一个指向您要写入的数据的指针。

这将以fin_val二进制模式写入文件:

fwrite(&fin_val,sizeof(fin_val),1,file);

您的编译器应该警告您您提供了一个整数值而不是指针。您应该调高编译器的警告级别。如果使用gcc,添加-Wall到编译器命令行。

于 2017-07-27T08:25:52.893 回答