このコードでは、最初に.wavファイルを読み込んでサンプル数を調べました。このサイズを使用して、私はそのサイズの配列を作成しようとしていました。その後、サンプルの同じ.wavファイルを読み込み、その配列に格納していましたが、762880サンプルのうち7500サンプル(約)しか読み取れませんでした。実行時にサイズが決定されるCで配列を作成する際のエラー
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void main(){
FILE *fp;
long n,i=0;
float *data;
FILE* inp =NULL;
FILE* oup =NULL;
float value =0;
signed short ss;
/* Open file */
fp = fopen("k1s1.wav", "rb");
fseek(fp, 0L, SEEK_END);
n = ftell(fp);
n=n/2-22;
printf("n:%ld",n);
fclose(fp);
data=malloc(n*sizeof(float));
inp = fopen("k1s1.wav","rb");
oup = fopen("cs123.txt","wt");
fseek (inp,44,SEEK_SET);// that didn't help getting the right result !!
i=0;
for(i=0;i<n;i++){
fread(&ss, sizeof(signed short) ,1 , inp);
//Now we have to convert from signed short to float:
value=((float)ss)/(unsigned)0xFFFF;
value= value* 2.0;
value= value*100000;
value= ceil(value);
value= value/100000;
fprintf(oup,"%f\n",value);
data[i]=value;
///printf("%lf\t",value);
}
fclose(inp);
fclose(oup);
printf("done");
}
この行を削除すると、「data [i] = value;」という行が削除されます。 forループではプログラムがうまく動作し、ファイルの出力を見ることができます。これらの値を配列に格納して、さらに計算する必要があります。何が原因なのですか?
'fopen()'、 'malloc()'、 'fread()'呼び出しをエラーチェックする必要があると主張する余地があります。しかし、あなたが「n」のために分かりやすいサイズを取得している場合、私はすぐに問題を見ることはありません。私はコードを試してみたことはありません。私は 'rewind(fp)'や 'fseek(fp、0L、SEEK_SET);'を使って '.wav'ファイルを再オープンしなくても済むことを観察しました。しかし、これは最適化であり、問題の原因ではありません。 –
コンパイラは出力に影響しますか? – Paras
ここでコンパイラが大きな要因になることはまずありません。このコードでは、標準のC言語を使用しています。その機能のどれも使用していませんが、 ''を含めてはいけません。明らかに、何らかの形でコンパイラの問題にぶつかっている可能性があります。どのコンパイラを使用していますか? (私はちょうどキー機能のエラーチェックでコードのバージョンをコンパイルしましたが、問題はないようです。私のマシンで最初に見つかった '.wav'ファイルは、私はMacOS Sierra 10.12.3とGCC 6.3.0を使ってMacで作業していました) –