Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Jessé P. de Melo

C criar vetor dentro de struct com valor de outra variavel

Recommended Posts

Boa tarde.

Estou resolvendo o seguindo problema.

Faca um programa que armazena filmes produzidos por varios diretores e: ´
• Crie e leia um vetor de 5 diretores, cada um contendo nome (maximo 20 letras), ´
quantidade de filmes e filmes. O membro filmes e um vetor, que deve ser criado ´
apos ter lido quantidade de filmes. Cada filme é composto por nome, ano e duracao. 
• Procure um diretor por nome, mostrando todos os filmes que ele já produziu. Repita o processo ate digitar uma string vazia.

Porque me código esta dando erro? Sem o índice do vetor compila mais com o índice não.

Código de resolução:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main (void){
    char diretor_pesq[21];

    struct diretores{
        char nome_dir[21];
        int qtd;
        struct filmes[qtd];   /*ONDE ESTA DANDO O ERRO*/
    };

        struct filmes{
        char nome_fil[30];
        int ano;
        int duracao;
    };

    struct diretores lista[5];

    for (int x=0;x<5;x++){
        printf("Digite um nome de um diretor: ");
        scanf("%21[^\n]",&lista[x].nome_dir);
        fflush(stdin);
        printf("Quantidades de filmes ? ");
        scanf("%i",&lista[x].qtd);
        fflush(stdin);
        for(int contador=0;contador<lista[x].qtd;contador++){
            printf("Nome do %i filme? ",contador+1);
            scanf("%30[^\n]",&lista[x].nome_fil[contador]);
            fflush(stdin);
            printf("Ano de producao do filme? ");
            scanf("%i",&lista[x].ano[contador]);
            fflush(stdin);
            printf("Duracao: ");
            scanf("%i",lista[x].duracao[contador]);
            fflush(stdin);
            }
        }
    printf("Digite um nome de diretor para pesquisar");
    scanf("%21[^\n]",&diretor_pesq);
    if(diretor_pesq==" "){
        exit(0);
    }

    for (int x=0;x<5;x++){
        char *teste=NULL;
        teste=strstr(lista[x].nome_dir,diretor_pesq);
        if(teste!=NULL){
            printf("Nome do diretor:%s\n",lista[x].nome_dir);
            for(int contador=0;contador<lista[x].qtd;contador++){
                printf("Nome do filme: %s\tAno: %i\tDuracao: %i min\n",lista[x].nome_fil[contador],lista[x].ano[contador],lista[x].duracao[contador]);
            }
        }
    }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem vários problemas...

 

O primeiro é que você está chamando a struct filmes antes de definir ela (a struct filmes está depois da struct diretores, mas você chama a struct filmes dentro da struct diretores).

 

A declaração de um vetor da struct filmes deveria ser assim:

struct filmes filmes2[100];

Ou seja, cria um vetor filmes2 de 100 posições de structs filmes.

 

Outro problema é que qtd nem recebeu nenhum valor, então mesmo que fazer isso fosse possível estaria errado, pois que tamanho o vetor teria se ainda não atribuiu nenhum valor a qtd? O tamanho de um vetor é fixado no momento em que ele é declarado, no caso de um vetor de comprimento variável seu comprimento depende do valor da variável entre os colchetes no momento em que ele é criado.

 

E finalmente não é possível colocar um vetor de comprimento variável como um elemento de uma struct, o vetor tem que ter comprimento fixo, ou para fazer o que você deseja teria que ser um vetor flexível (struct filmes filmes[];) e usar malloc() para alocar memória posteriormente ( https://stackoverflow.com/questions/32311269/can-we-have-a-struct-element-of-type-variable-length-array ).

 

(Tem outros erros nos nomes usados como parâmetros dos scanfs e printfs mais abaixo no código.)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso aconteceu por causa do famoso remendo que fico tentando fazer pra não perder tudo que fiz. Só percebi que tinha errado quando fui programar os prints. Vou apagar tudo e começar do zero, depois posto aqui.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou refazendo o código do zero, porém estou com duvidas. Segundo o trecho:

2 horas atrás, Jessé P. de Melo disse:

Crie e leia um vetor de 5 diretores, cada um contendo nome (maximo 20 letras), ´
quantidade de filmes e filmes. O membro filmes e um vetor, que deve ser criado ´
apos ter lido quantidade de filmes.

primeiro se cria o tipo de dados e depois modifica  um membro para se tornar um vetor. porém como faço isso se:

 

1 hora atrás, isrnick disse:

O tamanho de um vetor é fixado no momento em que ele é declarado

 

eu iria resolver criando um vetor externo da struct filme como vetor, mas não é isso que o exercício pede  Como resolvo o exercício seguindo as instruções do enunciado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Uma maneira seria usa um ponteiro na struct, depois quando tiver a quantidade cria o vetor de filmes fora da struct, e depois faz o ponteiro da struct apontar para o vetor.

 

#include <stdio.h>
#include <string.h>

int main()
{
    struct filme{
        char nome_fil[30];
        int ano;
        int duracao;
    };
    
    struct diretor{
        char nome_dir[21];
        int qtd;
        struct filme *filmes; //Ponteiro
    };
    
    
    struct diretor diretores[5];
    
    strcpy(diretores[0].nome_dir, "Joao Silva Santos");
    
    //Quantidade de filmes:
    diretores[0].qtd = 2;
    
    //Cria um vetor de filmes usando a quantidade:
    struct filme filmes0[ diretores[0].qtd ];
    
    //Faz o ponteiro filmes apontar para o vetor criado:
    diretores[0].filmes = filmes0;
    
    strcpy(diretores[0].filmes[0].nome_fil, "Joao e Maria");
    diretores[0].filmes[0].ano = 1970;
    diretores[0].filmes[0].duracao = 30;

    strcpy(diretores[0].filmes[1].nome_fil, "Rapunzel");
    diretores[0].filmes[1].ano = 2000;
    diretores[0].filmes[1].duracao = 90;
    
    printf(" %s\n %d\n\n %s\n %d\n %d\n\n %s\n %d\n %d\n",
            diretores[0].nome_dir, diretores[0].qtd,
            diretores[0].filmes[0].nome_fil,
            diretores[0].filmes[0].ano,
            diretores[0].filmes[0].duracao,
            diretores[0].filmes[1].nome_fil,
            diretores[0].filmes[1].ano,
            diretores[0].filmes[1].duracao
          );
    
    return 0;
}

 

Editado por isrnick
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela solução. Como não sei trabalhar direito com ponteiros vou deixar esse exercício salvo para quando souber ponteiros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×