Problems with struch and functions in c

Asked

Viewed 60 times

0

#define FICH "Dados.Dat"  /* Ficheiro  com os Dados */
#define DIM 30

FILE *fp;  /* Variavel Global pois e' util ao longo do prog. */
int cont = 0;

typedef struct
{
  char Nome[DIM+1];
  char Tipo[DIM+1];
  int Ano[DIM+1];
  int Tempo[DIM+1];
  int Duracao[DIM+1];
  char Desc[DIM+1];
  int Data[11];
  char Pais[DIM+1];
  char Lingua [DIM+1];
  char Empresa[2*DIM+1];
  char elenco[DIM+1];
  char Diretor[DIM+1];
  int ini[4];
  int fim[4];
  char Status; /* '*' Indica que o registo esta apagado */
} PRODUCAO;


void Mensagem(char *msg);


/* Le os dados de um registo introduzidos pelo utilizador */


 void Ler_Producao(PRODUCAO *p)
{
  int i;
  printf("titulo da producao    : "); gets(p->Nome);
  printf("Tipo de producao    : "); gets(p->Tipo);
  printf("ano de producao   : "); scanf("%d",&Ano);
  printf("duracao da producao em minutos : "); gets(p->Duracao);
  printf("tempo da producao em dias   : "); gets(p->Tempo);
  printf("data do lancamento    : "); gets(p->Data);
  printf("breve descrição ate 30 palavras  : "); gets(p->Desc);
  printf("pais onde foi produzido : "); gets(p->Pais); 
  printf("lingua da producao    : "); gets(p->Lingua);
  printf("Empresa distribuidora    : "); gets(p->Empresa);
  printf("Diretor    : "); gets(p->Diretor);

    while (p.elenco!="s" || p.elenco!="S" || cont<=20) {
    printf("\nindique um membro do elenco ,se quiser sair escreva apenas a letra S.:");
    scanf("%29s", &p->elenco[i]);
    i++;
    if  (p->elenco[i] == 'S' && p->elenco[i] == '\0') break;
    else cont++;
}



  p->Status=' ';
  fflush(stdin);

}

/* Mostra no ecra, os dados existente no registo */

void Mostrar_Producao(PRODUCAO )
{
  printf("Titulo.:%-30s\n",Nome);
  printf("Tipo.:%-30s\n",Tipo);
  printf("Ano de producao.:%4d\n",Ano);
  printf("Duracao.:%3d\n",Duracao);
  printf("Tempo que demorou a produzir.:%3d\n",Tempo);
  printf("Data.:%-10s\n",Data);
  printf("Breve Descricao.:%-30s\n",Desc);
  printf("Pais.:%-30s\n",Pais);
  printf("Idioma.:%-30s\n",Lingua);
  printf("Empresa Distribuidora.:%-60s\n",Empresa);
  printf("Diretor.:%-30s\n",Diretor);
  for (int i = 0; i < cont; i++) printf("\nElenco: %s", elenco);
}


void Listar()
{ long int N_Linhas =0;
  PRODUCAO reg;
  rewind(fp);
  while(1)
   {
    if (fread(&reg,sizeof(reg),1,fp)!=1) break;/* Sair do Ciclo */
    if (reg.Status=='*') continue ;  /* Passa ao proximo */
    Mostrar_Producao(reg);
    N_Linhas++;
    if (N_Linhas%20==0)
      Mensagem("PRIMA <ENTER> para continuar . . . ");
   }
 Mensagem("\n\nPRIMA <ENTER> para continuar . . . "); /* No fim da Listagem             */
}

void Inic()
{
  fp=fopen(FICH,"r+b"); /* Tentar Abrir */
  if (fp==NULL)
   {
    fp =fopen(FICH,"w+b");   /* Criar o Ficheiro */
    if (fp==NULL)
      {
       fprintf(stderr,"ERRO FATAL: Impossível Criar o Ficheiro de Dados\n");
       exit(1);
      }
   }
}
main()
{
    char  Opcao;
    Inic();
    while ((Opcao=Menu(MainMenu))!=OP_SAIR)
     switch(Opcao)
    {  
 while((Opcao=Menu(ProducaoMenu)) |=OP_PRODUCAO_SAIR)        
                             switch (Opcao)
                             {
                                    case OP_PRODUCAO_INSERIR:         Inserir_Producao(); break;
                                    case OP_PRODUCAO_ALTERAR:     Alterar_Producao(); break;
                                    case OP_PRODUCAO_APAGAR:      Apagar_Producao();  break;
                            case OP_PRODUCAO_LISTAR: Listar(); break;
                             }

When I try to list the data entered in the numerical cases the program does not give me the value entered but another value that I suppose is the position where it is. And the casting introduction function can’t make it stop because I used one so I can’t use the while someone knows a way to fix it? a introdução de dados (da erro na breve introdução também nao sei o que é :/

listagem da produção introduzida com os erros referidos em cima

  • while (p.cast!="s" || p.cast!="S" || cont<=20) how you created a pointer the ideal would not be to use -> ?

  • use -> in which case?

  • https://answall.com/questions/51180/diff%C3%A7a-real-between-operator-point-and-operator-arrow-in-c it seems that there is no such difference in C, C++ (which I have the habit of using) . is to access a member of a class or struct and -> is used to access a member of a pointer

  • I want the members not the pointer value that’s my mistake I don’t know how to access the values and not the pointers. is the q da be distracted in xD classes

1 answer

2

Its function Mostrar_Producao is all wrong, it’s amazing that you’re compiling:

void Mostrar_Producao(PRODUCAO) {
  printf("Titulo.:%-30s\n", Nome);
  printf("Tipo.:%-30s\n", Tipo);
  printf("Ano de producao.:%4d\n", Ano);
  printf("Duracao.:%3d\n", Duracao);
  printf("Tempo que demorou a produzir.:%3d\n", Tempo);
  printf("Data.:%-10s\n", Data);
  printf("Breve Descricao.:%-30s\n", Desc);
  printf("Pais.:%-30s\n", Pais);
  printf("Idioma.:%-30s\n", Lingua);
  printf("Empresa Distribuidora.:%-60s\n", Empresa);
  printf("Diretor.:%-30s\n", Diretor);
  for (int i = 0; i < cont; i++)
    printf("\nElenco: %s", elenco);
}

First the parameter is not defined, and each variable is not coming from the parameter. Correct form:

void Mostrar_Producao(PRODUCAO *p) {
  printf("Titulo.:%-30s\n", p->Nome);
  printf("Tipo.:%-30s\n", p->Tipo);
  printf("Ano de producao.:%4d\n", p->Ano);
  printf("Duracao.:%3d\n", p->Duracao);
  printf("Tempo que demorou a produzir.:%3d\n", p->Tempo);
  printf("Data.:%-10s\n", p->Data);
  printf("Breve Descricao.:%-30s\n", p->Desc);
  printf("Pais.:%-30s\n", p->Pais);
  printf("Idioma.:%-30s\n", p->Lingua);
  printf("Empresa Distribuidora.:%-60s\n", p->Empresa);
  printf("Diretor.:%-30s\n", p->Diretor);
  for (int i = 0; i < cont; i++)
    printf("\nElenco: %s", p->elenco);
}

Another problem with your code is that you apparently want the cast to be a set of people(seen this for in this function), but you have declared the cast only as an array of char. The question is: Is your "cast" a set of characters, or a list of words? In the second case, you need to declare a character array list:

  char elenco[NUMERO_DE_MEMBROS_DO_ELENCO][DIM + 1];

There are other ways to make this list(e.g. using char* to have a dynamic number of cast members instead of a static number defined in the compilation), and for this I suggest studying how pointers and dynamic memory work in C.

Finally, review your function Ler_Producao() in particular the while that checks p.elenco - Are you sure you don’t want to see p->elenco?

When compiling the program, turn on the options -Wall -Wextra, because they show messages serve as tips to find bugs in the program.

  • so how can I fix my producao

Browser other questions tagged

You are not signed in. Login or sign up in order to post.