我的代码是在PCM文件(一个充满短整数的音乐文件)中进行过滤,应用过滤器并进行输出。
当我执行它时(按F9),有时它会成功,而有些它会使我的可执行文件崩溃,但是如果我在它上面放一个printf / cout,使程序持续更长时间,它会增加它没有崩溃的机会。
非常奇怪,我不知道发生了什么,所以我无法修复它,请在我的代码中查看以下内容:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
short *vetor_entrada, *vetor_saida;
char nomeArquivoEntrada[50] = "sweep_100_3400.pcm", nomeArquivoSaida[50] = "saida.pcm";
size_t tamanhoArquivo;
int lerEntrada(){
FILE * pFile;
long lSize;
size_t result;
pFile = fopen ( nomeArquivoEntrada , "rb" );
if (pFile==NULL) return -1;
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
tamanhoArquivo=lSize/sizeof(short);
vetor_entrada = (short*) malloc (sizeof(short)*lSize);
vetor_saida = (short*) malloc (sizeof(short)*lSize);
if (vetor_entrada == NULL) return -1;
result = fread (vetor_entrada,sizeof(short),lSize,pFile);
if (result != lSize) return -1;
fclose (pFile);
return 0;
}
int escreverSaida(){
FILE * pFile;
pFile = fopen (nomeArquivoSaida, "wb+");
fwrite (vetor_saida , sizeof(short), tamanhoArquivo, pFile);
fclose (pFile);
}
void processamento(int k){
float *vetor_coeficientes = (float*) malloc (sizeof(float)*k);
short *vetor_amostras = (short*) malloc (sizeof(short)*k);
for(int i=0;i<k;i++){
vetor_coeficientes[i]=(float)1/(float)k;
vetor_amostras[i]=0;
}
for(int j=0;j<tamanhoArquivo;j++){
vetor_amostras[0]=vetor_entrada[j];
short aux=0;
for(int m=0;m<k;m++){
aux += vetor_coeficientes[m]*vetor_amostras[m];
}
vetor_saida[j]=aux;
for(int n=k;n>0;n--){
vetor_amostras[n] = vetor_amostras[n-1];
}
}
}
int main(){
lerEntrada();
processamento(32);
escreverSaida();
return 0;
}
&#34;过程中的循环&#34;功能(&#39; j&#39;增加一个)是主要问题(据我所见),如果我把printf(&#34;%d&#34;,j)放入其中,可能不会崩溃。
这是一些用于测试它的PCM文件: https://www.mediafire.com/?3l3iq8553jcy7dk
如何修复崩溃?
答案 0 :(得分:2)
这看起来不对
for(int n=k;n>0;n--){
vetor_amostras[n] = vetor_amostras[n-1];
vetor_amostras的范围是0 .. k - 1.您正在分配给[k]。