Usuário com melhor resposta
Erro na declação da variável

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.
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.
-
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.
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.
-
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.