1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Dúvida (básica?) em C++

Discussão em 'Programação' iniciada por Fito, 12 de Outubro de 2008. (Respostas: 16; Visualizações: 962)

  1. Fito

    Fito Power Member

    Pessoal entrei para a Universidade e tou a ter uma cadeira de Programação em C++. O problema é que eu não percebo lá muito disto.

    Estou aqui a (tentar) programar mas isto não me está a sair muito bem.

    O programa é simples e já o devem ter visto. É aquele em que inserimos o nome e ele depois diz: "Benvindo ao mundo do C++, Techzoner!".

    Ora aqui vai o algorítmo do programa:
    Código:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main ()
    
    {
        cout << "Insira o seu nome: ";
        string nome;
        cin >> nome;
        cout << "Benvindo ao mundo do C++," << nome << "!\n";
    }
      
    Ora, o meu problema é que quando carrego no enter depois de já ter posto o meu nome, o programa desaparece. Alguém sabe porquê?

    Obrigado a todos.
     
    Última edição pelo moderador: 13 de Outubro de 2008
  2. Laharl

    Laharl Power Member

    Porque está a dizer a mensagem que queres que apareca e a apaga-la muito rapido, por isso nem chegas a ver.

    Para veres a mensagem sem estares a adicionar mas linhas de código, comeca a correr todos os teus programas atraves da linha de comandos.

    Compila o programa, vai à linha de comandos e corre-o. Vais ver que já funciona sem desaparecer..
     
  3. Fito

    Fito Power Member

    Eu estou a utilizar o Microsoft Visual C++ 2008 (foi recomendado pelo prof). E acho que estou a seguir tudo o que ele disse para fazer mas não consigo correr o programa. Eu quando faço Start Without Debugging aparece o cmd (fundo preto) e é aí que supostamente o programa devia correr...
     
  4. JuSt_Me_AnD_yOu

    JuSt_Me_AnD_yOu What is folding?

    Faz no final um system("pause")
     
  5. Baderous

    Baderous Banido

    Não uses o system("PAUSE"); que isso torna-te dependente do SO.
    Usa antes isto no fim da main:

    Código:
    cin.get();
    E não te esqueças de colocar return 0 como última instrução (uma vez que a main devolve um int).
     
  6. Fito

    Fito Power Member

    Já funcionou com esse comando (obrigado).

    Mas incomoda-me o facto do algoritmo do stor estar igualzinho ao meu (sem este comando do pause) e isto não funcionar... (e não, o stor não se enganou).

    Não será alguma definição do programa que me estará a causar isto?
     
  7. Baderous

    Baderous Banido

    Isso funciona, mas como estás a correr o programa a partir do IDE, ele abre e fecha logo. Se o corresses a partir da linha de comandos isso já não acontecia.
     
  8. JuSt_Me_AnD_yOu

    JuSt_Me_AnD_yOu What is folding?

    Não é mesmo assim. O programa finaliza se não tiver nada para o parar.
    Se o executares a pata, isto é, chamas a linha de comandos a mão e lá chamas o executável que fizeste do teu programa, ai já vais ver o resultado aparecer.
     
  9. Fito

    Fito Power Member

    Ok, percebi.

    Agradeço a vossa ajuda e paciência :)

    De qualquer das formas amanhã vou ter aula e o melhor que tenho a fazer é levar o portátil para ele me explicar isso tudo.

    Mais uma vez, obrigado.
     
  10. bsd

    bsd Power Member

    Eh pá, quando o programa termina, o Windows fecha logo a janela. É só isso!
    O programa escreve e logo a seguir termina, portanto não chegas a ver o que ele escreveu. Normalíssimo, está correcto.

    Mas tens um erro no teu programa: a função main não devolve nenhum valor e é obrigatório que o faça. Tens de acrescentar:

    Código:
      ...
      return 0;
    }
    
     
  11. LuisFP

    LuisFP Power Member

    x2
     
  12. OubeLa

    OubeLa Power Member

    Com o Visual Studio o programa não fecha logo :P pelo menos aqui. F7 para compilar, Ctrl+F5 para executar (sem debug).
     
  13. eu apenas li os outros posts em Z nao sei se ja tens a soluçao mas aqui fica uma:
    (nao consegui usar o tipo string por isso apaguei o #include <string> no entanto aqui fica uma versao)

     
  14. bsd

    bsd Power Member

    Ó tiagozh, o teu conselho para usar o char [16] não é muito bom. E se o utilizador escrever mais do que 15 caracteres?

    Nesse caso, de acordo com o padrão da linguagem, o comportamento do programa é indefinido (undefined behaviour). Na prática, o que vai acontecer na maioria das plataformas é que à medida que o utilizador vai pondo mais caracteres estes vão sendo escritos por cima daquilo que vem a seguir no stack.

    Neste caso, aquilo que vem a seguir é primeiro o endereço na pilha da moldura de stack da função que chamou o main(), se este for corrompido, quando o main retornar, essa função vai ter as suas variáveis locais todas maradas. Aquilo que vem a seguir depois é o endereço de retorno da função main(), se este for corrompido, o main vai retornar para um sítio à maluca algures na memória. Ou seja, experimenta no teu programa dar-lhe mais de 15 caracteres para ver o que acontece, podes seguir no debugger, é instrutivo.

    Ou seja, usa uma std::string.

    Quanto ao system("pause") isto é programar em estilo MS-DOS, é executar o cmd.exe e dizer para ele fazer o comando pause. Isto é completamente inadequado nos dias de hoje.

    Quanto ao getchar(), ele não existe no padrão da linguagem, também é um arcaísmo do tempo do MS-DOS. De qualquer modo, é preferível ao system("pause") que implica criar um processo e executar o cmd.exe só para esperar uma tecla.

    Há duas soluções: ou apenas se usa coisas do C++ padrão, e então usa-se a solução que outros já apontaram (cin >> qq_coisa), ou então, se assumimos a dependência do Windows, usamos as funções de consola do Windows directamente (AllocConsole, FreeConsole, ReadConsoleInput).
     
  15. _freelancer_

    _freelancer_ Power Member

    Subscrevo. Esta é a solução sem mais rodeios de código ou subterfúgios para correr o programa pela linha de comandos.
     
  16. tens razao bsd mas eu nao consegui usar a string. . . mas existe uma funcao acho qe é a malloc() ou algo assim qe pode mudar o valor do array conforme a necessidade. . . mas nunca tive essa necessidade. . .

    e quanto ao getchar() e ao system("pause"), eu pessoalmente uso o getchar() é-me mais facil de utilizar, mas o cin<<qlqr coisa tambem é bem pensado, mas para quem trabalha em dev c++ pode usar o return ja q o dev nao deixa com q o main seja void.

     
  17. bsd

    bsd Power Member

    É exactamente como escreveram no primeiro post. De qualquer modo, é fundamental quando se está a programar ter uma referência da linguagem à mão. Ninguém sabe todas as funções de cor, por muita experiência que tenha.

     

Partilhar esta Página