Jump to content

Outra duvida, Tipos


Polmax
 Share

Recommended Posts

Outro erro que nao consigo perceber .

#include <stdio.h>

int main ()
{
printf ("A temperatura em graus Fahrenheit é de : \n%f",cf ());

}

float cf ()
{
float cel;
printf ("Digite uma temperatura em graus Celcius.\nExemplo : 34\n");
scanf ("%f",&cel);
return (1.8*cel+32);
}

A unica razao que encontro para o erro é , depois que faço a operaçao no return o resultado daquilo nao seja float.

Link to comment
Share on other sites

O problema é que dentro do main(), na linha do printf, o compilador ainda nao tem informacoes de como funciona a funcao cf() ... e assume que devolve um inteiro.

Mas no string de formatacao tens um "%f" que é para double, e nao é compativel com int.

Tens duas solucoes:

1) Passa a definicao da funcao cf para antes da definicao da funcao main.

2) acrescenta um prototipo antes da funcao main.

Outra coisa: aumenta o nivel de warnings do teu compilador para o maximo possivel. Em principio o proprio compilador te avisa da razao dos erros.

Ah (ehehe) outra coisa: nao uses float a nao ser que tenhas uma razao muito forte para isso. Usa sempre double.

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

Vamos la por partes :O

Primeiro, sim era mesmo isso, eu ate hoje não sabia que a função main podia vir depois das outras, como nos disseram que era especial eu pensei que tinha que ser sempre a primeira xD.

Segundo, mesmo sabendo isso prefiro que ela seja a primeira porque sou teimoso  😁 , ou seja se calhar pra mim o melhor era a outra opção. Esse prototipo que tas a falar é meter a função num ficheiro ".h" e depois fazer o include no inicio ?

Terceiro, vou seguir o conselho do float, mas porque é preferível double ao float ?.O único que percebi era que o double seria "maior" que o float, ou ha mais alguma vantagem ?

Por ultimo eu nao sei mudar o nivel de warnings  ? . Neste momento tou a usar o gcc no ubuntu.

Link to comment
Share on other sites

1) localizacao da funcao main no codigo

A funcao main pode estar localizada em qualquer parte do codigo. A unica restricao é que as funcoes chamadas dentro do main teem de ser conhecidas pelo compilador.

Para o compilador conhecer uma funcao tens varias hipoteses:

a) metes o prototipo (*) num ficheiro header e fazes #include desse header

b) metes o prototipo directamente no codigo, antes da funcao main

c) defines a funcao (uma definicao inclui um prototipo) antes da funcao main

Por exemplo:

#include <stdio.h>

/* prototipo */
int bar(int);

/* definicao (inclui prototipo) */
int foo(int valor) {
   return valor - 2;
}

int main(void) {
   int a, b;
   a = foo(42); /* foo esta definida antes de main: OK */
   b = bar(24); /* bar tem o prototipo antes de main: OK */
   printf("%d %d\n" a, b); /* printf tem o prototipo no header de sistema <stdio.h>: OK */
   return 0;
}

/* definicao da funcao bar() */
int bar(int teste) {
   return teste + 2;
}

Se comecas a fazer programas com varios ficheiros, sugiro que facas um ficheiro h para cada ficheiro c. No ficheiro h metes o prototipo das funcoes definidas no ficheiro c (alem de tipos e constantes).

Depois, inclui o proprio h em cada c para o compilador verificar se esta tudo certo.

2) float ou double

Em C, os calculos com virgula flutuante sao feitos com double, mesmo que os valores sejam float.

Ou seja

float a, b, c;
a = 5.6; /* nota: 5.6 é um valor de tipo double, que é convertido para float automagicamente */
b = 4.3; /* se b fosse double, a conversao nao era necessaria */
c = a + b; /* a e b sao convertidos para double, a soma é feita em double */
          /* e depois convertida para float para meter em c */

(Na maioria das implementacoes) o float ocupa, de facto, menos memoria que o double. Mas isso nao é razao para o escolher ... a nao ser que precises de milhoes deles (esta é a razao forte).

O double esta para virgula flutuante mais ou menos como o int esta para inteiros.

3) warnings no gcc

O mais basico é chamares o gcc com as opcoes -Wall e -Wextra.

Mas faz "man gcc" e estuda as opcoes disponiveis.

Para o maximo de warnings que eu acho bom, eu chamo o gcc (atraves dum alias) com

gcc -std=c89 -pedantic -Wall -Wno-missing-braces -Wextra
-Wno-missing-field-initializers -Wformat=2 -Wswitch-default -Wswitch-enum
-Wcast-align -Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5
-Wstrict-prototypes -Winline -Wundef -Wnested-externs -Wcast-qual
-Wshadow -Wunreachable-code -Wlogical-op -Wfloat-equal
-Wstrict-aliasing=2 -Wredundant-decls -Wold-style-definition
-Werror
-ggdb3
-O0
-fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing
-lm

Os -W## sao as opcoes de warning 🙂

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

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.