Ir ao conteúdo
  • Cadastre-se

C Problema ao usar struct e atribuição


alecounter

Posts recomendados

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á

  • Amei 1
Link para o comentário
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!

 

  • Amei 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!