Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Erro no uso de iostream

Recommended Posts

:natalohmy:

 

Vejam o erro deste programa; ele é dividido em três partes:

 

Arquivo: Chama_Fatorial_Arranjo.cpp

 

#include "Fatorial_Arranjo.h"
#include <cstdlib>
int main()
{
   int Nfat,valorN, valorP;
   calculando minhaclasse; // definindo a ocorrência da classe calculo
   cout << "Entre com o valor para aplicar o fatorial." << endl;
   cin >> Nfat;
   cout << "fatorial de " << Nfat << " e: " << minhaclasse.fatorial(Nfat)
   << endl;
   cout << endl;

   cout << "Entre com Valor de N e o Valor de P para calcular o arranjo."
   << endl;
   cin >> valorN;
   cin >> valorP;

   cout << endl;
   cout << "O Valor do Arranjo e: " 
   << minhaclasse.arranjo (valorN,valorP) << endl;

   system ("pause");
   return 0;
}

 

Arquivo: Fatorial_Arranjo.cpp

 

//inclui a definição da classe Fatorial_arranjo A partir de
//Fatorial_Arranjo.h
#include "Fatorial_Arranjo.h"

calculando::calculando()
{
recebe_fatorial=0;
recebe_aranjo=0;
}

int calculando::fatorial (int fat) // fatorial
 {
  if (fat > 1)
    {

      recebe_fatorial= fat * fatorial(fat -1);    
      return (recebe_fatorial);
     }
     else
      {
        return  1;
       }
     };

int calculando::arranjo (int n) // Arranjo
{
int fator = n;

while(n > 1)
 {
  fator *= (n-1); // Multipica e depois atribui, o mesmo que fazer:
                  //fator = (fator * (n-1));

  n--;
 }

return (fator);
}
//==================================
int calculando::arranjo (int n, int p) //Sobrecarga do método  Arranjo
{
 recebe_aranjo=arranjo(n)/arranjo(n -p);

 return (recebe_aranjo);
}

 

Arquivo Fatorial_Arranjo.h

 

//Funções-membro definidas em Fatorial_Arranjo.cpp
#ifndef FATORIAL_ARRANJO_H
#define FATORIAL_ARRANJO_H

#include <iostream>
using namespace std;

  class calculando
  {
    private: 
             int recebe_fatorial;
             int recebe_aranjo; 
             int arranjo (int n);

   public:
          int arranjo (int n, int p); // funnção sobrecarregada
          int fatorial (int fat);
          calculando();
   };
#endif     

 

Erro:

 

Fatorial_Arranjo.h:6:20: fatal error: iostream: No such file or directory

 

Algumas pessoas estão afirmando, que o Mingw não reconhece o a biblioteca iostream, mas quando eu a uso somente em arquivos .cpp (um ou vários) para criar um programa, não dá problema. Quando usei iostream no arquivo .h, foi que acusou o erro acima.

 

Quando eu compilava este programa com o DEV-C++ não dava este problema. O DEV-C++, também usava o gcc. A diferença é que estou usando o MingW instalado na máquina e o Geany 0.21 como IDE.

 

Onde está o erro ?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Você está utilizando o gcc ou g++? O gcc é o compilador de C da GCC ( GNU Compiler Collection), enquanto o g++ é o da C++. Normalmente esses erros acontecem quando se utiliza o compilador de C ao invés do de C++...

 

 

Como está o processo de compilação? Digo, as chamadas ao g++ feitas pela IDE? Tente renomear o .h para .hpp para ver se resolve, algumas IDE's dão problema com isso.

 

Dica de design: coloque o mínimo possível de headers em um .h. Se o <iostream> não é utilizado no header em si, coloque-o no .cpp. Imagina: você faz uma biblioteca que utiliza vários headers que dão conflito com alguns headers que quem utiliza a biblioteca usa. Você poderia resolver isso colocando os headers nos seus .cpp's ao invés de no .h, mas colocando no .h você força o usuário da biblioteca a utilizar um header que ele não quer, sem precisar. A C e a C++ tem várias features como tipos incompletos para evitar o uso de headers no .h.

 

 

 

Abraços :D

 

 

@edit:

 

Só para garantir: qual sua versão do MinGW?

Compartilhar este post


Link para o post
Compartilhar em outros sites

:natalohmy:

 

Rapaz !! agora você colocou uma pulga na minha orelha. Eu acredito ter baixado o g++, mas por via das dúvidas, este foi o link onde baixei o MingW foi:

 

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110802/mingw-get-inst-20110802.exe/download

 

e o nome do arquivo baixado é:

 

mingw-get-inst-201110802.exe

 

Se eu tiver baixado o arquivo errado, por favor indique um link ou pagina corretos. Estando errado, terei que desintalar o MingW e a IDE, e reinstalar tudo de novo. Sem confirmar esta possibilidade, não posso testar tuas dicas.

 

Fiz um teste: compilei um outro programa, que não dá problema, e na janela de mensagens do geany 0.21; no campo: compilador apareceu a seguinte mensagem:

 

 

g++ -Wall -c "namespace_teste.cpp" (no diretório: D:\FonteLivroC++\Capitulo-10)

 

Compilação terminada com sucesso.

 

Uma questão me veio a mente: a IDE Geany 0.21 parece vir com a bilioteca GTK. Nao pude confirmar se esta IDE vem com alguma versão do GCC. Caso venha poderia estar ocorrendo conflito ou aversão da IDE poderia estar sobrepondo a que que instalei do MingW ?

 

Você ou alguem conhece esta IDE ? Foi a única que aparentemente funcionou.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Está certo, é essa a versão mesmo. O MinGW instala o compilador de C (gcc) E o compilador de C++ (g++) juntos. O que diferencia é o modo como você o chama na linha de comando( por gcc ou g++ ). Pelo seu quote, parece que o compilador está certo...

 

 

Bom amigo, não sei porque não compila, deve ser algum problema com o geany... Faça o seguinte: Pegue esses 3 arquivos e copie para uma pasta, de modo a ficar os 3 na mesma pasta. depois, abra o prompt de comando e navegue até a pasta que estão esses 3 arquivos e digite os 3 comandos abaixo:

 

g++ -o Chama_Fatorial_Arranjo.o -c Chama_Fatorial_Arranjo.cpp
g++ -o Fatorial_Arranjo.o -c Fatorial_Arranjo.cpp
g++ -o Fatorial_Arranjo.exe Chama_Fatorial_Arranjo.o Fatorial_Arranjo.o

 

Caso o comando g++ não funcionar, adicione a pasta bin do MinGW no PATH do Windows.

 

 

Abraços :D

 

@edit:

 

Compilando assim funcionou direitinho aqui. Ah, e evite usar o system("pause"). Use getchar() ao invés disso. Veja abaixo porque:

 

http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

:natalbiggrin:

 

 

Realizei o procedimento que você indicou e deu certo !!! Lendo com atenção sua solução, vi que nos comandos de compilação não aparece o arquivo .h Por que ?

 

Em minhas tentativas de compilação, eu abria os arquivos Chama_Fatorial_arranjo.cpp, Fatorial_Arranjo.cpp e Fatorial_arranjo.h, no Geany, e tentava compilar cada um deles para depois construir o executável. Era nessa ora que dava o erro. Arquivos .h não se compila ?

 

Resolvi fazer o teste usando o Geany, desta vez só abrindo os arquivos

Chama_Fatorial_arranjo.cpp e o arquivo Fatorial_Arranjo.cpp. Compilei os arquivos com sucesso, mas quando mandei construir com a aba do arquivo Chama_Fatorial_arranjo.cpp selecionada, surgiram as seguintes mensagens de erro:

 

C:\DOCUME~1\joubert\CONFIG~1\Temp\cc0cT8Br.o:Chama_Fatorial_arranjo.cpp:(.text+0x18): undefined reference to `calculando::calculando()'

 

C:\DOCUME~1\joubert\CONFIG~1\Temp\cc0cT8Br.o:Chama_Fatorial_arranjo.cpp:(.text+0x64): undefined reference to `calculando::fatorial(int)'

 

C:\DOCUME~1\joubert\CONFIG~1\Temp\cc0cT8Br.o:Chama_Fatorial_arranjo.cpp:(.text+0x146): undefined reference to `calculando::arranjo(int, int)'

 

collect2: ld returned 1 exit status

 

Compilação falhou.

 

 

Quando mandei construir com a aba do Fatorial_Arranjo selecionada, os erros foram diferentes.

 

 

 

Erros:

 

c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../libmingw32.a(main.o): In function `main':

 

C:\MinGW\msys\1.0\src\mingwrt/../mingw/main.c:73: undefined reference to `WinMain@16'

 

collect2: ld returned 1 exit status

 

Compilação falhou

 

 

Qual o motivo destes erros ?

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Arquivo .h contém informações sobre como acessar tal função ou classe em um .cpp. Você não a compila. Você passa os .cpp's para o compilador, ele compila e o linker automaticamente encontra as referências do .h utilizadas com as funções em si.

 

O problema está com o Geany, não seu código. Utilizar IDE's é a pior coisa que tem. Elas tentam esconder a parte de compilação de você e aparecem problemas como esse que você está enfrentando. A compilação faz parte da C/C++, não adianta tentar escondê-la porque erros obscuros vão aparecer.

 

Sugiro que pare de utilizar IDE's e utilize a compilação por linha de comando. Para editar as sources, baixe o Notepad++, ele tem uma ótima source highlighting.

 

Se deseja aprender mais sobre o GCC para como utilizá-lo, procure no google tutoriais sobre ele. Após já estar acostumado como ele funciona pode valer a pena comprar o livro "The Definitive Guide to GCC", 2nd edition. Ele tem instruções interesssantes sobre otimização e compilação.

 

Também vale a pena aprender a utilizar makefiles, elas automatizam o processo de compilação para não ter que ficar digitando cada comando de compilação na linha de comando, o que pode até causar erros por problemas de digitação.

 

Quer ver um exemplo? copie o texto abaixo e salve com o nome de "makefile" (é, sem extensão) na pasta onde estão os .cpps e .h do projeto que você teve problemas.

 

Fatorial_Arranjo.exe: Chama_Fatorial_Arranjo.o Fatorial_Arranjo.o
g++ -o Fatorial_Arranjo.exe Chama_Fatorial_Arranjo.o Fatorial_Arranjo.o

Chama_Fatorial_Arranjo.o: Chama_Fatorial_Arranjo.cpp Fatorial_Arranjo.h
g++ -o Chama_Fatorial_Arranjo.o -c Chama_Fatorial_Arranjo.cpp

Fatorial_Arranjo.o: Fatorial_Arranjo.cpp Fatorial_Arranjo.h
g++ -o Fatorial_Arranjo.o -c Fatorial_Arranjo.cpp

 

(caso der algum erro na makefile substitua os espaços dos comandos do g++ por UM TAB. Talvez o fórum converta o tab em espaços, e a makefile PRECISA de TABs para funcionar).

 

Após salvar com esse nome, apenas digite:

 

mingw32-make

 

Ele vai compilar automaticamente seu programa.

 

 

Após aprender sobre makefiles vale a pena dar uma olhada no CMake também, mas já esteja acostumado com makefiles e compiladores... não queira aprender sobre as autotools, são horríveis e muito complexas, use o CMake no lugar, muito melhor.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

:natalbiggrin:

 

 

Sou obrigado a me curvar ante sua argumentação; resta então algumas questões de ordem prática.

 

Uma das razões de eu insistir em IDEs era a captura e visulização das mensagens de erro, que ao serem informadas, e ao selecionar o erro, seria apontada a linha correspondente; facilitando a correção. Sua argumentação derrubou esta visão, pois como demonstrado podem aparecer erros que não existem. Percebi que para programas de um só arquivo esta IDE atende, mas diante do discutido acima já estou duvidando.

 

Fica a questão: se tudo se dará na velha tela preta do “DOS”, não fica mais difícil achar a linha errada? Imagine uma lista de erros como a discutida acima; não verei o código simultaneamente e nem terei linhas com letras coloridas que facilitam achar o erro.

 

Outro ponto que me chamou a atenção foi a seqüência de comandos:

 

g++ -o Chama_Fatorial_Arranjo.o -c Chama_Fatorial_Arranjo.cpp

g++ -o Fatorial_Arranjo.o -c Fatorial_Arranjo.cpp

g++ -o Fatorial_Arranjo.exe Chama_Fatorial_Arranjo.o

Fatorial_Arranjo.o

 

Na primeira e segunda linha entendi que ao fazer:

 

g++ -o nome_arquivo.o –c nome_arquivo.cpp

 

Estou criando um arquivo objeto a partir do arquivo cpp e fazendo sua compilação via arquivo cpp.

 

Na terceira linha é que não entendi. Quando é feito:

 

g++ -o nome_arquivo.exe arquivo1.o arquivo2.o

 

parece que se está criando novamente os arquivos objetos, não entendi. Um outro ponto que me chamou atenção foi a criação do arquivo exe. Ele não teria que ser criado a partir do arquivo Chama_Fatorial_Arranjo ou ter o mesmo nome deste ? pergunto isto, pois não é o arquivo Chama_Fatorial_Arranjo que tem a função principal do programa (main()) ?

 

Eu fiz o teste com o makefile, substitui os espaços por TAB, mas recebi a mensagem:

 

makefile:2: *** missing separator. Stop
.

 

O numero 2 indica linha do erro ? eis o conteúdo do arquivo modificado,

 

Fatorial_Arranjo.exe: Chama_Fatorial_Arranjo.o Fatorial_Arranjo.o

g++ -o Fatorial_Arranjo.exe Chama_Fatorial_Arranjo.o Fatorial_Arranjo.o

 

Chama_Fatorial_Arranjo.o: Chama_Fatorial_Arranjo.cpp Fatorial_Arranjo.h

g++ -o Chama_Fatorial_Arranjo.o -c Chama_Fatorial_Arranjo.cpp

 

Fatorial_Arranjo.o: Fatorial_Arranjo.cpp Fatorial_Arranjo.h

g++ -o Fatorial_Arranjo.o -c Fatorial_Arranjo.cpp

 

No bloco de notas os TABs mostram "espaços" menores.

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se seu editor for bom, você não terá problema nenhum pra ir até os erros. Eu uso e recomendo o vim. É muito rápido navegar pra qualquer linha de qualquer arquivo. Você pode também criar marks e tags (usando, por exemplo, o ctags), o que faz com que a navegação entre invocações e definições de funções seja instantânea (mesmo que as funções sejam definidas em arquivos diferentes).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Não sei se o vim é uma boa opção... aposto que ele dá medo aos navegantes mais novos ^^^

 

Bom, é o seguinte como funciona o g++:

 

g++ -o output input

 

Esse é o modo mais básico sobre como o g++ funciona. A opção -o especifica o que vai ser a saída do g++, enquanto a parte de input especifica os arquivos de entrada no compilador.

 

Por exemplo, eu poderia muito bem ter escrito assim:

 

g++ -o Fatorial_Arranjo.exe Fatorial_Arranjo.cpp Chama_Fatorial_Arranjo.cpp

 

O programa também seria compilado assim. Imagino que você entenda o que eu fiz acima. Entra-se os arquivos de sources, o g++ os compila e a saída é Fatorial_Arranjo.exe. Se você não especificasse a opção -o, a saída seria o arquivo a.exe:

 

g++ Fatorial_Arranjo.cpp Chama_Fatorial_Arranjo.cpp

 

Imagino que você não queira esse nome na saída, não é?

 

 

Bom, o que eu fiz nos outros exemplos? Eu primeiro compilei as sources, sem fazer a linkagem, com a opção -c. Aliás, se você digitar g++ --help, você encontrará na opção -c o escrito: "Compile and assemble, but do not link". O que acontece é que o g++ cria os arquivos objetos a partir das sources, mas não cria o executável em si, pois não tem informações sobre as dependências externas que são resolvidas na hora da linkagem.

 

g++ -o output -c input

 

Mas, para criar o executável em si, o g++ precisa linkar os arquivos objetos em um .exe, não é? É isso que essa parte faz:

 

g++ -o Fatorial_Arranjo.exe Fatorial_Arranjo.o Chama_Fatorial_Arranjo.o

 

Ele faz só a parte de linkagem, pois a de compilação e de assembling ele já fez com as instruções anteriores. Veja que o esqueleto é o mesmo se utilizássemos arquivos .cpp:

 

g++ -o output input

 

E também sairia um arquivo a.exe se nós colocássemos:

 

g++ Fatorial_Arranjo.o Chama_Fatorial_Arranjo.o

 

 

Então acho que sua dúvida foi sanada sobre isso. Se não compreende a parte de compilação, assembling e linkagem de um compilador, sugiro que estude um livro sobre eles. Se não estou enganado, aquele livro sobre o GCC ensina isso em algum lugar...

 

Mas então, qual o propósito desse modo maior que usei para compilar? Ele é usado em makefiles. À medida que seu programa cresce, a compilação vai demorando mais e mais, ficando muito complicado de tanto digitar as sources quanto esperar toda a compilação a partir de uma mudança em, sei lá, uma linha. Aquela opção -c serve para isso. Combinando ela na makefile que te dei de exemplo, o g++ só vai compilar as sources que você mudou. O g++ só vai compilar os .cpp que foram modificados, e não todos, e realizar a linkagem, o que vai demorar MUITO menos tempo se seu programa for grande. Se você modificar um .h, ele vai compilar só os .cpp's que incluem esse .h e realizar a linkagem. Isso pode salvar MUITO tempo de desenvolvimento quando o programa é grande.

 

Aqui, vou colocar o link para a makefile certinha:

 

http://ge.tt/9ASpl4B

 

Cole essa makefile e substitua a antiga. Veja que usei tabs ao invés de espaços. Qualquer tutorial de introdução à makefiles na internet vai te ensinar porque (aliás, sugiro que leia. Tem MUITOS tutoriais de introdução à makefiles na internet, mas poquíssimos sobre a parte mais avançada)...

 

 

Então, sobre o que você falou do geany, você está falando sobre um debugger que o geany deve ter incluído. Bom, se estivesse no linux, eu falaria para você usar o kdbg, um debugger MUITO bom para o GCC. No windows, sugiro que leia isso abaixo,pode ajudar:

 

http://www.cs.colorado.edu/~main/cs1300/doc/mingwfaq.html#debugging

 

Não recomendo que utilize o insight, já usei ele e ele é MUITO bugado, muito mesmo. Então acho que pode ser uma boa ideia tentar usar esse outro compilador, o jessie. Ele é escrito em java, então ele deve ser portável tanto para windows quanto para linux. Você pode tentar compilar o kdbg no cygwin também, mas não sei se vai funcionar...

 

Bom, o debugger vai fazer isso que você falou que o geany faz.

 

Ah, e adicione a opção -g no g++ para ele funcionar com debuggers:

 

g++ -g -o output input

g++ -g -o output -c input

g++ -g input

g++ -g -c input

...

 

Essa opção -g deixa o código maior e mais lento para ele funcionar com os debuggers. Então sempre utilize somente para quando for fazer isso. Quando for compilar seu programa para distribuí-lo para outras pessoas, remova o -g.

 

 

Qualquer coisa, só perguntar ;D

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.