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:  
alecounter

C Problema ao usar struct e atribuição

Recommended Posts

Oi pessoal tudo bem? alguém poderia me explicar por que está dando erro ao compilar este código:

typedef struct {
    float raio;
} CIR;

typedef struct {
    float lado1;
    float lado2;
    float lado3;
} TRI;

typedef struct {
    float lado1;
    float lado2;
} RET;

typedef struct {
    int tipo;
    union {
        CIR circulo;
        TRI triangulo;
        RET retangulo;
    } dimensoes;
} GEOMETRIA;

float calcula_area(GEOMETRIA figura) {
    switch(figura.tipo) {
        case(0): return(3.1415*pow(figura.dimensoes.circulo.raio,2));
        case(1):
            float a = figura.dimensoes.triangulo.lado1;
            float b = figura.dimensoes.triangulo.lado2;
            float c = figura.dimensoes.triangulo.lado3;
            float p = (a+b+c)/2;
            return(sqrt(p*(p-a)*(p-b)*(p-c)));
        case(2):
            return(figura.dimensoes.retangulo.lado1*figura.dimensoes.retangulo.lado2);
        default: return(-1);
    }
}

quando altero a função calcula_area da seguinte maneira, o código compila:

typedef struct {
    float raio;
} CIR;

typedef struct {
    float lado1;
    float lado2;
    float lado3;
} TRI;

typedef struct {
    float lado1;
    float lado2;
} RET;

typedef struct {
    int tipo;
    union {
        CIR circulo;
        TRI triangulo;
        RET retangulo;
    } dimensoes;
} GEOMETRIA;

float calcula_area(GEOMETRIA figura) {
    float a,b,c,p;
    switch(figura.tipo) {
        case(0): return(3.1415*pow(figura.dimensoes.circulo.raio,2));
        case(1):
            a = figura.dimensoes.triangulo.lado1;
            b = figura.dimensoes.triangulo.lado2;
            c = figura.dimensoes.triangulo.lado3;
            p = (a+b+c)/2;
            return(sqrt(p*(p-a)*(p-b)*(p-c)));
        case(2):
            return(figura.dimensoes.retangulo.lado1*figura.dimensoes.retangulo.lado2);
        default: return(-1);
    }
}

obrigado desde já

Editado por alecounter
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem regras quanto a declaração de estruturas de controle switch: a regra relevante, para esse caso é que, não podê declarar tipo de dados abaixo da declaração case. Porém se estive dentro de uma bloco { } essa limitação não aplica-se.

e.i:

switch(figura.tipo) {
        case(0): return(3.1415*pow(figura.dimensoes.circulo.raio,2));
        case(1): {
            float a = figura.dimensoes.triangulo.lado1,
                  b = figura.dimensoes.triangulo.lado2,
                  c = figura.dimensoes.triangulo.lado3,
                  p = (a+b+c)/2;
            return(sqrt(p*(p-a)*(p-b)*(p-c)));
        }
        case(2):
            return(figura.dimensoes.retangulo.lado1*figura.dimensoes.retangulo.lado2);
        default: return(-1);
    }

P.s.: só tome cuidado com isso!

 

Editado por AnsiC
  • Amei 1

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

×