Ola. Galera, to tentando compilar um codigo em c no ubuntu 9.4 usando o gcc. Só que tem a biblioteca iostream.h que roda no dev-c++ (no windows e usa como compilador justamente o gcc), fui la no diretório usr/include e não tem mesmo essa biblioteca, se eu não a declaro ele diz que o metodo sqrt não tem referência definida. Alguém??
O Código:
#include <stdlib.h>
#include <iostream.h>
#include <math.h>
int main ()
{
int A, B, C;
float DELTA, ALPHA, BETA;
printf("\nValor da variavel A: ",A);
scanf("%i",&A);
printf("\nValor da variavel B: ",B);
scanf("%i",&B);
printf("\nValor da variavel C: ",C);
scanf("%i",&C);
DELTA = (B*B) -4*A*C;
//DELTA = pow (B,2) -4*A*
if (DELTA > 0)
{
ALPHA = ((-B)+(sqrt(DELTA))) /(2*A);
printf("\nAlpha eh { %0.1f }\n\n",ALPHA);
BETA = ((-B)-(sqrt(DELTA)))/(2*A);
printf("\nBeta eh { %0.1f }\n\n",BETA);
}
else
if (DELTA == 0)
{
ALPHA = ((-B)+(sqrt(DELTA))) /(2*A);
printf("\nAlpha e Beta sao iguais { %0.1f }\n\n",ALPHA);
}
else
printf("\n DELTA < 0, portanto nao ha raizes reais! \n\n");
return 0;
}
Uma coisa que eu percebi no seu codigo eh que vc esta tipo fazendo um “mix” entre C e C++ da uma revisada nesse codigo ae.
Vc tem que decidir ou fazer o codigo em C ou C++, se vc decidir por C remova o iostream porque vc nao esta nem usando (ate onde eu sei strq esta definida em math). Ai sim vc pode usar o compilador gcc normalmente como vc esta fazendo, somente verifique se vc tem a libc6-dev, se tiver compile seu programa com a chave -lm
ex:
gcc prog.c -o prog -lm
Se vc optar por C++ vai ter bastante mudancas no seu codigo e outras coisas mais tipo:
Primeiro: seu arquivo tem a extensao .cpp, se nao tiver renomeie, talvez nao faca diferenca mas eh bom pra manter uma padronizacao.
Segundo: Nao eh uma boa usar o gcc pra compilar c++. Use o g++
Terceiro: Vc nao precisa mais usar <iostream.h> use somente sem o .h o ANSI Standard c++ nao usa .h
#include <cstdio>
#include <cmath> // note que foi tirado o ".h" e posto um "c"
using namespace std; // para poder importar tudo que está sob o namespace std
...
printf ("%.2f", log10 (2.3));
Entretanto, seus arquivos de headers devem ter a extensão “.h” ou melhor, “.hpp”, como o Boost faz. Só alguns headers da biblioteca-padrão do C++ é que não têm extensão.
Note que versões MUITO antigas de alguns compiladores C++ podem não ter esses headers <cstdio> etc.
[quote=windsofhell]Cara algumas coisas tem que ser observadas.
Uma coisa que eu percebi no seu codigo eh que vc esta tipo fazendo um “mix” entre C e C++ da uma revisada nesse codigo ae.
Vc tem que decidir ou fazer o codigo em C ou C++, se vc decidir por C remova o iostream porque vc nao esta nem usando (ate onde eu sei strq esta definida em math). Ai sim vc pode usar o compilador gcc normalmente como vc esta fazendo, somente verifique se vc tem a libc6-dev, se tiver compile seu programa com a chave -lm
ex:
gcc prog.c -o prog -lm
Se vc optar por C++ vai ter bastante mudancas no seu codigo e outras coisas mais tipo:
Primeiro: seu arquivo tem a extensao .cpp, se nao tiver renomeie, talvez nao faca diferenca mas eh bom pra manter uma padronizacao.
Segundo: Nao eh uma boa usar o gcc pra compilar c++. Use o g++
Terceiro: Vc nao precisa mais usar <iostream.h> use somente <iostream> sem o .h o ANSI Standard c++ nao usa .h
Fala ae se funcionou, ok?
//Daniel[/quote]
Então Daniel…To querendo fazer em C e no dev-c++ do windows ele reconhece normalmente a biblioteda iostream.h quando se esta desenvolvendo em C.
Agora olha só, quando eu compilo aquele codigo com o gcc no ubuntu aparece a seguinte mensagem de erro: delta.c:3:22: error: iostream.h: Arquivo ou diretório inexistente.
Tanto com o .h como sem, e se eu retirar essa biblioteca do codigo aparece 3 vezes isso aqui : delta.c:(.text+0xef): undefined reference to `sqrt’ (pq tem tres sqrt no codigo)
eu concordaria com oq vc disse, até onde eu sei era pra ta definida na math.h se não fosse esse erro ao retirar a iostream.h
Este e o meu problema heheh…
[quote=thingol]Em C++ moderno várias bibliotecas antigas do C foram “adotadas” e postas sob o namespace std.
Entretanto, seus arquivos de headers devem ter a extensão “.h” ou melhor, “.hpp”, como o Boost faz. Só alguns headers da biblioteca-padrão do C++ é que não têm extensão.
Note que versões MUITO antigas de alguns compiladores C++ podem não ter esses headers <cstdio> etc.[/quote]
[quote=iigorr][quote=thingol]Em C++ moderno várias bibliotecas antigas do C foram “adotadas” e postas sob o namespace std.
Entretanto, seus arquivos de headers devem ter a extensão “.h” ou melhor, “.hpp”, como o Boost faz. Só alguns headers da biblioteca-padrão do C++ é que não têm extensão.
Note que versões MUITO antigas de alguns compiladores C++ podem não ter esses headers <cstdio> etc.[/quote]
Brother, é tudo c e os headers tão tudo .h[/quote]
Entao eh isso que o Thingol falou.
Troca o iostream.h vc nao precisa dele, o sqrt ta no math.h
a) De fato, sqrt e outros métodos de math.h estão no arquivo libm.a, que pode ser acessado usando-se a opção de compilação “-lm”.
De modo geral, se um arquivo de biblioteca (.a) tem o nome libXXXX.a, ele pode ser acessado usando-se a opção “-lXXXX”, onde l é a letra L minúscula. Por exemplo, no Solaris existe uma biblioteca chamada “libiberty.a”, que é acessada usando-se “-liberty”. Que curioso.
b) No Linux, quando você quer acessar algum arquivo include que deve ser acessado apenas a partir do C++, não do C, como é o caso de <iostream> (ou também <iostream.h>), eles não são diretamente acessíveis quando você compila seu programa como C, e é por isso que ele dava erro de não achar o iostream.h.
Eu expliquei direitinho no post anterior o que é “-lm”. Basicamente você informa ao linker (que é chamado indiretamente pelo gcc) qual é o arquivo .a que você quer usar.
[quote=thingol]Eu expliquei direitinho no post anterior o que é “-lm”. Basicamente você informa ao linker (que é chamado indiretamente pelo gcc) qual é o arquivo .a que você quer usar.