如果循环上没有打印代码崩溃,我该如何解决?

时间:2014-08-20 03:00:01

标签: c++

我的代码是在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

如何修复崩溃?

1 个答案:

答案 0 :(得分:2)

这看起来不对

    for(int n=k;n>0;n--){
        vetor_amostras[n] = vetor_amostras[n-1];

vetor_amostras的范围是0 .. k - 1.您正在分配给[k]。