Ir ao conteúdo
  • Cadastre-se

C criar vetor dentro de struct com valor de outra variavel


Posts recomendados

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]);
            }
        }
    }
}

 

Link para o comentário
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.)

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

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;
}

 

  • Curtir 1
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!