Ir ao conteúdo

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


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

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

Postado

@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
  • Solução
Postado

@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
Postado

@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
Postado
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 :)

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