2017-07-27 1 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コンパイラからの警告はすべて重要な意味でですが、通常は重大なエラーの兆候です!また、スタックオーバーフローについて尋ねるときは、コンパイラから何らかの診断を逐語的に質問にコピーしてください。

問題はここにある:

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;は関数呼び出しではありません。また、これは正常なコンパイラで診断メッセージを生成したはずです。 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では少しでもエラーメッセージがありますが、gccではたくさんあります。 –

関連する問題