Linguagem C no Ubuntu - Biblioteca iostream.h

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

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 sem o .h o ANSI Standard c++ nao usa .h

Fala ae se funcionou, ok?

//Daniel

Em C++ moderno várias bibliotecas antigas do C foram “adotadas” e postas sob o namespace std.

Por exemplo, em vez de

#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
...

printf ("%.2f", log10 (2.3));

você usa

#include &lt;cstdio&gt;
#include &lt;cmath&gt; // 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…

Se você vai usar apenas C, você tem de usar #include <stdio.h> em vez de #include <iostream.h>

É que stdio.h define printf, scanf e outros carinhas.

iostream.h, por outro lado, define aqueles operadores "<<", ">>", cout etc. que são usados em C++, não em C.

[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=thingol]Se você vai usar apenas C, você tem de usar #include <stdio.h> em vez de #include <iostream.h>

É que stdio.h define printf, scanf e outros carinhas.

iostream.h, por outro lado, define aqueles operadores "<<", ">>", cout etc. que são usados em C++, não em C.
[/quote]

Dei uma suspirada de alivio auahu mas persiste o erro msm com o stdio incluso

[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

e compila usando aquela chave que eu falei -lm

//Daniel

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.

Acabei de compilar e rodar aqui no macosx. No linux funciona do mesmo jeito.
compilei usando o gcc :

gcc test.c -o test

#include <stdlib.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;  
}  

Works, com a chave -lm, comecei a usar o gcc agora nem sei koeh esse lance de chaves, tem como me dar uma explicada bem rapida ai no que é essa -lm.

Vlw Galera…

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.

Um arquivo .a contém vários arquivos .o, que são o resultado da compilação de cada programa .c ©, .C (C++) ou .s (Assembly).
No seu caso, o arquivo libm.a contém algum arquivo .o que contém o código compilado (ou assemblado) para o método sqrt.

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

Um arquivo .a contém vários arquivos .o, que são o resultado da compilação de cada programa .c ©, .C (C++) ou .s (Assembly).
No seu caso, o arquivo libm.a contém algum arquivo .o que contém o código compilado (ou assemblado) para o método sqrt.
[/quote]

Desculpa cara, passo batido aquele post nos f5…Vi la. Obrigado.