Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...