Ir ao conteúdo
  • Cadastre-se
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á

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

 

  • 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

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

×