Ir ao conteúdo
  • Cadastre-se

C Process Returned -1073741819 (0xc0000005) Code::Blocks


Verniana
Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Boa noite! Estou no primeiro semestre de Eng. Computação e ainda estou bem travada com C.

 

Alguém poderia me dizer qual é o problema deste meu código???

 

Algumas vezes ele finaliza e outras ele simplesmente para e avisa "Process Returned -1073741819 (0xc0000005)". Alguém sabe me dizer qual o problema?

 

Grata desde já.

 

O dito cujo:

#include <stdio.h>   //Biblioteca
#include <stdlib.h>  //Biblioteca
#include <locale.h>  //Biblioteca

//=============================================================================

struct Filmes
{
    char Nome_do_Filme[100];
    char Genero[100];
    char Diretor[100];
    char Duracao[100];
    int Ano_de_Lancamento;
} ;

//=============================================================================

void print_Filmes(struct Filmes filme, int a);
FILE *cadFilmes;

//=============================================================================

int main()
{
    setlocale(LC_ALL, "Portuguese");

    const int tam_filmes=5;
    struct Filmes Cine[tam_filmes];
    int i;

//=============================================================================

    cadFilmes = fopen("FILMES.txt", "w");
    if(cadFilmes == NULL)
    {
       printf("\n Erro ao tentar abrir o arquivo!!!");
    }

//=============================================================================

    for(i=1; i<tam_filmes+1; i++)
    {
        printf("\n\n Sobre o filme %i: \n", i);

        printf("\n Título do filme: ");
        scanf("%[^\n]", &Cine[i].Nome_do_Filme);
        fflush(stdin);

        printf("\n Gênero do filme: ");
        scanf("%[^\n]", &Cine[i].Genero);
        fflush(stdin);

        printf("\n Diretor do filme: ");
        scanf("%[^\n]", &Cine[i].Diretor);
        fflush(stdin);

        printf("\n Ano de lançamento do filme: ");
        scanf("%i", &Cine[i].Ano_de_Lancamento);
        fflush(stdin);

        printf("\n Duração do filme: ");
        scanf("%s", &Cine[i].Duracao);
        fflush(stdin);
    }

//=============================================================================

    printf("\n_____________Conteúdo do vetor Cine:______________");
    for(i=1; i<tam_filmes+1; i++)
    {
        print_Filmes(Cine[i], i);
    }

//=============================================================================

    return 0;
}

//=============================================================================

void print_Filmes(struct Filmes filme, int a)
{
    printf("\n\n___________Filme %i_____________\n", a);
    printf("Título            : %s \n", filme.Nome_do_Filme);
    printf("Gênero            : %s \n", filme.Genero);
    printf("Diretor           : %s \n", filme.Diretor);
    printf("Ano de lançamento : %i \n", filme.Ano_de_Lancamento);
    printf("Duração           : %s \n", filme.Duracao);

    fprintf(cadFilmes,"\n\n___________Filme %i_____________\n", a);
    fprintf(cadFilmes,"Título            : %s \n", filme.Nome_do_Filme);
    fprintf(cadFilmes,"Gênero            : %s \n", filme.Genero);
    fprintf(cadFilmes,"Diretor           : %s \n", filme.Diretor);
    fprintf(cadFilmes,"Ano de lançamento : %i \n", filme.Ano_de_Lancamento);
    fprintf(cadFilmes,"Duração           : %s \n", filme.Duracao);
};

 

Novo Documento de Texto.txt

Link para o comentário
Compartilhar em outros sites

@Verniana A acesso a elementos de um vetor começa do elemento 0 até tamanho - 1, então p.ex essa parte do for deve ser corrigida,

for(i=1; i<tam_filmes+1; i++)

 

Para,

for(i=0; i<tam_filmes; i++)

 

Talvez o erro seja por isso, mas o código ainda tem o problema do buffer do teclado que e fflush não resolve ou tem comportamento imprevisível (no fórum tem alguns tópicos sobre o uso dessa função). Remova o as linhas com fflsuh e tente usar fgets em vez de scanf para as strings e na entrada int use scanf dessa forma para evitar a questão do buffer,

scanf("%d%*c", &Cine[i].Ano_de_Lancamento);

 

fgets para strings,

fgets(Cine[i].Nome_do_Filme,100,stdin);

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Solução

@Verniana Olá.

 

19 minutos atrás, Verniana disse:

FILE *cadFilmes;

 

Evite declarar variáveis globais, só vai te dar problemas...

 

20 minutos atrás, Verniana disse:

scanf("%[^\n]", &Cine[i].Nome_do_Filme);

 

Nome_do_Filme é uma string, e com & você está passando o endereço de que?

Se quiser usar &, use assim:

scanf("%99[^\n]", &Cine[i].Nome_do_Filme[0]);

Dessa forma, você passa o endereço do primeiro elemento da string, mas normalmente só usamos & quando queremos que a leitura seja efetuada a partir de um elemento cujo índice não seja 0, então você pode simplesmente omitir o &.

Aliás, percebeu que tem um 99 depois do % lá? Justamente porque scanf() não tem como saber o tamanho da string, então você tem que dizer pra ela quantos caracteres podem ser lidos e armazenados, e você declarou uma string com espaço para 99 caracteres não-nulos + 1 caractere nulo. Por isso é mais conveniente usar fgets() para ler strings, eu postei sobre isso aqui:

 

32 minutos atrás, Verniana disse:

fflush(stdin);

 

Não use fflush() dessa forma, use apenas para streams de saída.

Se está usando na entrada é porque talvez notou que se não usar, a próxima chamada da scanf() fica zoada... E bem, quando você termina de inserir os dados, você pressiona a tecla Enter, portanto sobra um '\n' na stdin que poderá ser lido na próxima chamada da scanf().

Pra solucionar isso, você pode ler e ignorar esse caractere com um especificador da seguinte forma: %*c.

Dessa forma você consome todos os dados, e é o que se espera em um programa assim.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Midori Muito obrigada! O problema estava no -

for(i=1; i<tam_filmes+1; i++)

--------------------
Também troquei o fflush por -

clean_stdin();

--------------------
Muito obrigada pela ajuda ^^

Desculpa pela demora do retorno!

 

 

-------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------

 

 

@Lucca Rodrigues Muito obrigada! De fato o 

scanf("%[^\n]"

estava me dando problemas. Depois que você falou para trocar por -

scanf("%99[^\n]", &Cine[i].Nome_do_Filme[0]);

o código fluiu.

 

Muito obrigada pela ajuda 💜 e desculpa pela demora do retorno.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

44 minutos atrás, Verniana disse:

Também troquei o fflush por -


clean_stdin();

O que sobra de uma leitura não é lixo, então você não tem que limpar nada, tem que consumir o que resta no fluxo.

Veja:

#include <stdio.h>

int main()
{
    int x;
    char c;
    
    printf("Digite um numero: ");
    scanf("%d", &x);
    
    printf("Digite um caractere: ");
    scanf("%c", &c);
    
    printf("Respostas: <%d> <%c>", x, c);
    
    return 0;
}

Na saída:

image.png.8547408ed222ec2e107f1e3b6a4319ee.png

Isso ocorre porque eu digitei '5' e '\n' (Enter), como o '\n' não interessa na leitura de um inteiro, ele permanece na stdin até que você o leia, e foi o que aconteceu quando eu chamei a scanf() novamente, o '\n' foi lido e armazenado na variável c.

Como eu havia dito:

Em 04/05/2021 às 19:15, Lucca Rodrigues disse:

Pra solucionar isso, você pode ler e ignorar esse caractere com um especificador da seguinte forma: %*c.

Portanto:

#include <stdio.h>

int main()
{
    int x;
    char c;
    
    printf("Digite um numero: ");
    scanf("%d%*c", &x);
    
    printf("Digite um caractere: ");
    scanf("%c%*c", &c);
    
    printf("Respostas: <%d> <%c>", x, c);
    
    return 0;
}

Na saída:

image.png.e71d409142e7372b4a278a48accc12c2.png

 

44 minutos atrás, Verniana disse:

estava me dando problemas. Depois que você falou para trocar por -


scanf("%99[^\n]", &Cine[i].Nome_do_Filme[0]);

o código fluiu.

Acredito que convém usar fgets() para ler strings, dê uma olhada na documentação caso se interesse :)

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...