Jump to content

Warning de compilação: conversion from 'double' to 'int'


nana91
 Share

Recommended Posts

Olá pessoal, estou a trabalhar em C, e tenho um pouco de dificuldade neste problema

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int roundint (double x)
{
 return x >= 0 ? (int) (x+0.5) : (int) (x-0.5);
}

double grade_basic (double exam, double lab, double quizzes)
{
 return exam * 0.65 + lab * 0.30 + quizzes;
}

double grade_exact (double exam, double lab, double quizzes)
{
 return exam < 8.5 ? exam : grade_basic(exam, lab, quizzes);
}

int grade_final (double exam, double lab, double quizzes)
{
 return roundint (grade_exact (exam, lab, quizzes));
}

double grade_strict_exact (double exam, double lab, double quizzes)
{
   return ((lab>exam) ? (exam < 8.5 ? exam : grade_basic(exam, lab, quizzes)):(exam*0.95 + quizzes));
}

int grade_strict_final (int exam, double lab, double quizzes)
{
   double f;
   f = roundint (grade_strict_exact (exam, lab, quizzes));
   return (f>(exam+2.5)) ? roundint(exam+2.5): f;
}

void test_grades (void);

void test_grades_blind (void);

void test_grade_strict ();


int main (void)

{

//test_grades();

//test_grades_blind();

test_grade_strict();

return 0;

}


void test_grades (void)

{
 double x;
 double b;
 double q;
 double z;
 int g;
 system("chcp 1252");
 printf("Nota do exame: ");
 scanf("%lf", &x);
 printf("Nota da parte prática: ");
 scanf("%lf", &b);
 printf("Nota dos questionários: ");
 scanf("%lf", &q);
 z = grade_basic(x, b, q);
 printf("Nota básica: %f\n", z);
 z = grade_exact(x, b, q);
 printf("Nota exata: %f\n", z);
 g = grade_final(x, b, q);
 printf("Nota final: %d\n", g);

}

void test_grades_blind (void)

{
 double x;
 double b;
 double q;
 int g;
 scanf("%lf", &x);
 scanf("%lf", &b);
 scanf("%lf", &q);
 g = grade_final(x, b, q);
 printf("%d\n", g);

}

void test_grade_strict ()
{
   double x;
   double b;
   double q;

   int g;

   scanf("%lf", &x);
   scanf("%lf", &b);
   scanf("%lf", &q);

   g=grade_strict_final(x, b, q);
   printf("%d\n", g);
}

Tenho os seguintes erros e não consigo resolver:

c(34): error C2220: warning treated as error - no 'object' file generated

c(34): warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data

c(110): warning C4244: 'function' : conversion from 'double' to 'int', possible loss of data

Alguém me pode explicar que erros são estes. Obgd.

Link to comment
Share on other sites

No meu gcc 4.4.5 isso compila sem problemas. Como é que estás a compilar? De qualquer forma os warnings são bem explícitos, sempre que tiveres um double faz conversão explícita para int e ele deixa de fazer isso.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Nao sao erros; sao warnings. Mas tu, muito bem!, pediste ao compilador para tratar os warnings como erros (o C2220) e nao criar um executavel mesmo sem erros a serio.

O warning que tu mostras (o C4244) acontece porque estas a devolver um double numa funcao especificada como devolvendo int.

Sugestao: altera a definicao da funcao para devolver double (ou define as variaveis locais como int).

double grade_strict_final (int exam, double lab, double quizzes)
{
    double f;
    f = roundint (grade_strict_exact (exam, lab, quizzes));
    return (f>(exam+2.5)) ? roundint(exam+2.5): f;
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Parece-me que ele pretende exatamente o oposto, i.e. que a nota final devolvida seja um int.

A conversao seria feita na funcao que chama a grade_strict_final() ...

int variavel = grade_strict_final(3, 5.33333333, 7.654321);

Se a funcao devolver um double a conversao para int sera feita automagicamente, sem erros nem warnings em niveis bastante elevados de reporting.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Isso seria verdade se a função grade_strict_final não tivesse como objectivo devolver um int. Como é evidente pelo código, esta função vai desenvolver sempre um valor inteiro e como tal é absurdo declará-la como devolvendo um double.

Na ausência de comentários, o valor de retorno da função é uma pista essencial para o que a função faz de facto, e esta função devolve uma nota final que é sempre um valor inteiro com base nas notas do exame, dos labs e dos quizzes.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.