Problems with struch and functions in c

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] == '
#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] == '%pre%') 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;
                             }
') 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 casting function can not make it stop because I used a for so I can not use while someone knows a way to repair this?

    
asked by anonymous 12.01.2018 / 11:13

1 answer

2

Your Mostrar_Producao function is all wrong, and it's incredible 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 that 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 (since this for in this function), however you 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 an array of characters:

  char elenco[NUMERO_DE_MEMBROS_DO_ELENCO][DIM + 1];

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

Finally, review your Ler_Producao() function in particular while that checks p.elenco - are you sure you do not want to see p->elenco ?

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

    
12.01.2018 / 11:40