2017-07-27 56 views
-2

我的操作體系是窗口,我想我的數據寫入與16bit.Here一個PCM是我的代碼:C寫的UINT16到文件有錯誤

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

難道你真的得到任何診斷在所有?來自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無效的,但你在uint16_t通過。它應該是&fin_val,以便fwrite獲得該變量的地址。

在相關說明中,fclose;不是一個函數調用,這也應該在任何健全的編譯器中產生診斷消息。它應該是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;} 
^~~~~~ 
+0

我使用vs2017,只有一個錯誤消息:讀取位置0x ....時發生訪問衝突,不像gcc @ _ @那樣提示! –

+0

@馬慧超*編譯期間,不在運行程序期間。 –

+0

@馬慧超你絕對有必要找到這些編譯器診斷的輸出位置並仔細閱讀它們,否則你將永遠不會編寫一個可用的C程序! :D –

1

fwrite需要指向要寫入的數據的指針。

這將寫fin_val在二進制模式的文件:

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

你的編譯器應該警告你,你所提供的整數值,而不是一個指針。您應該調高編譯器的警告級別。如果使用gcc,則將-Wall添加到編譯器命令行。

+0

感謝,我不是很熟悉C,現在我知道了什麼問題,非常感謝。 –

+0

重要的是您打開/關閉編譯器警告。它將在未來幫助你很多。編譯器可以找到許多(但不是全部)編碼錯誤。 –

+0

我會記住這一點,並提高自己,但有一個錯誤信息vs vs但在gcc很多.. –