none
Erro na declação da variável RRS feed

  • Pergunta

  • Olá a todos. Estou fazendo um programa pra gravar tudo o que entra e o que sai da placa de som. Não conheço direito essa coisa de MFC, já que só uso C++ quando preciso de um trabalho de mais baixo nível, como esse. Então uso só APIs. Ainda não entendo de classes no C++ (só em outras linguagens). Pra organizar as coisas aqui, dividi o meu programa em:

    • Programa.cpp - Cuida só da inicialização e do loop de mensagens.
    • Janela.cpp - Cria a janela do programa. É mais a interface entre o usuário e as funções do programa. Tem só a DialogProc.
    • Wave.cpp - Tem as rotinas que recebem e gravam os dados direto em um arquivo.

    Na hora de rodar, funciona (quase) tudo certinho. O programa abre, configuro as opções que quero e tal e aperto "Iniciar". Ele começa a gravar. O problema é quando aperto pra parar. Dá um erro ao acessar uma variável global. Esse aqui:

     

    Unhandled exception at 0xffd7ffbf in Gravador.exe: 0xC0000005: Access violation reading location 0xffd7ffbf.

     

    É assim:

     

    No Janela.cpp, quando a pessoa manda gravar, faço umas verificações e chamo a função:

     

        if(Gravando = IniciarGravacao(Arquivo, dEntrada, dSaida)){

     

    Essa função está no Wave.cpp. Eu passo o arquivo, o identificador do dispositivo de entrada e o identificador do dispositivo de saída. Quando a pessoa aperta pra parar, tenho só um:

     

        PararGravacao();

     

    No Wave.cpp, tenho assim:

     

        HWAVEIN WaveInHandle;

     

        bool IniciarGravacao(char *Caminho, UINT dEntrada, UINT dSaida) {

             ...

             waveInStart(WaveInHandle);

             ...

        }

        void PararGravacao() {

             waveInStop(WaveInHandle);

             ...

        }

     

    O erro que eu disse, dá na linha do waveInStop. E isso começou quando eu dividi o meu programa em vários arquivos. Então a única explicação que me parece fazer sentido é a de que isso tenha de algum jeito a ver com a declaração da variável. A minha intenção era que ela fosse global dentro do Wave.cpp, mas parece que não funciona assim. Engraçado que o debugger consegue mostrar o valor dela na watchlist...

     

    Como posso resolver isso?

     

    Obrigado.

    quarta-feira, 27 de junho de 2007 18:35

Respostas

  • Como voce está usando o waveInOpen( ... )? Preparando o buffer com waveInPrepareHeader(..)? A sua callback (waveInProc) tem restrição a chamada de bibliotecas do sistema tambem.

     

    O que parece é que a callback está acessando area de memoria que foi desalocada por outra thread - no caso de voce estiver usando esse de modelo para capturar os dados.

     

    Talvez fosse bom usar SetEvent(..) para controlar o stop e a saida da sua aplicacao para garantir que isso nao ocorra - se for mais de 1 thread.

     

    No debug esse tipo de situação não ocorre, por que não existe corrida de execução.. voce está controlando linha-a-linha a execução do seu código.

     

    Voce pode estar usando um buffer super enorme também.. mas talvez nunca seja suficiente para uma aplicação genérica.

    terça-feira, 17 de julho de 2007 14:23
  • Oi. Já descobri o problema. Eu tinha caído na besteira de usar uma variávei alocada localmente como buffer de uma estrutura global. Era mais ou menos assim:

     

    ESTRUTURA var;

     

    void Rotina() {

        ...

        char Buffer[10];

        var.buffer = Buffer;

        ...

    }

     

    Aí, claro, sendo uma variável local, no fim da rotina ela era desalocada. Consegui resolver isso usando malloc.

     

    Obrigado pela resposta.

    quinta-feira, 19 de julho de 2007 14:10

Todas as Respostas

  • Como voce está usando o waveInOpen( ... )? Preparando o buffer com waveInPrepareHeader(..)? A sua callback (waveInProc) tem restrição a chamada de bibliotecas do sistema tambem.

     

    O que parece é que a callback está acessando area de memoria que foi desalocada por outra thread - no caso de voce estiver usando esse de modelo para capturar os dados.

     

    Talvez fosse bom usar SetEvent(..) para controlar o stop e a saida da sua aplicacao para garantir que isso nao ocorra - se for mais de 1 thread.

     

    No debug esse tipo de situação não ocorre, por que não existe corrida de execução.. voce está controlando linha-a-linha a execução do seu código.

     

    Voce pode estar usando um buffer super enorme também.. mas talvez nunca seja suficiente para uma aplicação genérica.

    terça-feira, 17 de julho de 2007 14:23
  • Oi. Já descobri o problema. Eu tinha caído na besteira de usar uma variávei alocada localmente como buffer de uma estrutura global. Era mais ou menos assim:

     

    ESTRUTURA var;

     

    void Rotina() {

        ...

        char Buffer[10];

        var.buffer = Buffer;

        ...

    }

     

    Aí, claro, sendo uma variável local, no fim da rotina ela era desalocada. Consegui resolver isso usando malloc.

     

    Obrigado pela resposta.

    quinta-feira, 19 de julho de 2007 14:10