Jump to content
Fórum Script Brasil
  • 0

Loop infinito:


G4BRI33L

Question

É um projeto de aprendizagem, estou estudando por minha conta com algumas apostilas e um pacote de vídeos tutoriais.

Quando chega na parte no material do loop (whileloop), é ensinado como criá-lo.

Consigo criar um códico que funcione da seguinte maneira:

#include <iostream>
using namespace std;
int main() {
     int x = 0;
     while(x<=2147303425) {       // não sei o que é este número, mas o consegui como resultado tentando funções diversas. É o limite da int type?
          cout << x << endl;
          x++;
     }
}
Esse código faz com que o output escreva na tela de 1 a 2147303425, um número por linha, até que o programa se encerra quando chega ao final. Tentei, no entanto, fazer com que o loop não parasse, e aparecesse a saída númerica de 0 até onde o programa calculasse. No entanto, pesquisando. descobri que há problemas em se tratar de 'infinito' ou de 'maior número', até porque o tipo da variável tem um limite, é isso, não? Este foi o que mais me pareceu correto:
#include <iostream>
using namespace std;
int main()
{
    int x = 0;
    int numeroDeLinhas = x;

    while(x<=-1){
        cout << numeroDeLinhas << endl;
        x++;
    }
}

Quando testo, não acontece nada.

Há como criar esse programa de maneira tal que na saída apareça o número da linha atual, continuamente, até eu fechar o programa manualmente?

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

Na verdade, acho que o limite da variável int é 2147483647.

Na verdade, vai de -2147483648 até 2147483647. Se quiser declarar como unsigned int, aí vai de 0 a 4294967296.

Em sistemas de 64 bits, uma variável do tipo long long deve guardar valores equivalentes ao de uma int elevado ao quadrado (ou seja, 4294967296 elevado a 2 -- o que deve ser um número de 21 dígitos).

Se quiser trabalhar com números ainda maiores ou infinitos, vai ter que usar uma biblioteca própria pra isso. Aqui tem uns exemplos de umas que devem servir pra você:

http://gmplib.org/

http://www.tc.umn.edu/~ringx004/mapm-main.html

https://mattmccutchen.net/bigint/

http://www.codeproject.com/Articles/1202/A...Integer-Numbers

Link to comment
Share on other sites

  • 0
Na verdade, acho que o limite da variável int é 2147483647.

Na verdade, vai de -2147483648 até 2147483647. Se quiser declarar como unsigned int, aí vai de 0 a 4294967296.

Em sistemas de 64 bits, uma variável do tipo long long deve guardar valores equivalentes ao de uma int elevado ao quadrado (ou seja, 4294967296 elevado a 2 -- o que deve ser um número de 21 dígitos).

Se quiser trabalhar com números ainda maiores ou infinitos, vai ter que usar uma biblioteca própria pra isso. Aqui tem uns exemplos de umas que devem servir pra você:

http://gmplib.org/

http://www.tc.umn.edu/~ringx004/mapm-main.html

https://mattmccutchen.net/bigint/

http://www.codeproject.com/Articles/1202/A...Integer-Numbers

Hm, essas bibliotecas conseguem atribuir valores até onde a memória suporta. Pensando dessa forma, será assim que funcionaria um tipo de código malicioso com a intensão de fritar o computador, ele faria a contagem exceder a capacidade da memória?

Link to comment
Share on other sites

  • 0

Fazendo contagem de um em um?? Não, isso levaria horas, talvez dias.

Preencher com números grandes deve ser um modo bem trabalhoso pra estourar a memória. Deve ser muito mais simples alocar explicitamente logo de uma vez um espaço bem grande a ponto de tomar toda a memória livre... a não ser que o SO tenha alguma proteção contra isso. Hum... fiquei interessado em testar, qualquer dia eu tento.

Agora, ocupar toda a memória não deve causar dano nenhum ao hardware, caso tenha sido que você tenha imaginado ao dizer que o código fritaria o computador.

Link to comment
Share on other sites

  • 0
Fazendo contagem de um em um?? Não, isso levaria horas, talvez dias.

Preencher com números grandes deve ser um modo bem trabalhoso pra estourar a memória. Deve ser muito mais simples alocar explicitamente logo de uma vez um espaço bem grande a ponto de tomar toda a memória livre... a não ser que o SO tenha alguma proteção contra isso. Hum... fiquei interessado em testar, qualquer dia eu tento.

Agora, ocupar toda a memória não deve causar dano nenhum ao hardware, caso tenha sido que você tenha imaginado ao dizer que o código fritaria o computador.

Sim, mas mantendo uma contagem de um em um não seria uma maneira mais sigilosa de atacar um computador que está sempre ligado, do que alocar explicitamente?

Link to comment
Share on other sites

  • 0
Sim, mas mantendo uma contagem de um em um não seria uma maneira mais sigilosa de atacar um computador que está sempre ligado, do que alocar explicitamente?

Acho que o único sigilo que poderia existir seria o de tentar esconder que é o seu processo que está tomando a memória, mas não sei dizer se isso é possível.

No caso, se for com contagem, a única diferença é que a ocupação de memória será feita lentamente, o que pode levar até o seu processo a ser descoberto antes da hora.

Bom, quero deixar claro aqui que não pretendo programar um código com essa intenção, apenas gostaria de entender a relação.

Sim, não gosto muito de escrever sobre esses assuntos, pois tem muita gente que procura em tudo oportunidades pra atrapalhar os outros, e pode acabar usando as informações pra fazer besteira.

Mas de qualquer modo, o ponto principal aqui é que uma biblioteca de números infinitos não é um perigo ameaçador só porque pode atingir o limite de memória. Qualquer programa pode usar a memória até atingir o limite. Um simples array faria todo esse trabalho com uma única linha.

Link to comment
Share on other sites

  • 0

CONSEGUI!!!

#include <iostream>

using namespace std;

int main() {

    int a1 = 1;
    int r = 1;
    int n = 1;
    int an;

    while(a1==1) {

        an = a1+(n-1)*r;
        cout << an << endl;
        n=n+1;


    }

}

To feliz! lol

Agora, ocupar toda a memória não deve causar dano nenhum ao hardware, caso tenha sido que você tenha imaginado ao dizer que o código fritaria o computador.

Então você jura que se eu deixar o loop "ao infinito" não vai queimar nada na minha máquina?

Link to comment
Share on other sites

  • 0
Então você jura que se eu deixar o loop "ao infinito" não vai queimar nada na minha máquina?

Fica tranquilo, se fosse fácil assim queimar alguma peça de hardware, a gente veria computador pegando fogo por aí o tempo todo.

Bom... se algum programa chegar a travar o sistema operacional, você pode ter problemas com o sistema decorrentes do travamento, né. Apesar de que a gente tá cansado de ver o windows travar e ligar funcionando sem problemas logo depois, nunca se sabe... dependendo da atividade que ele esteja fazendo no momento, algum problema mais sério pode acontecer (geralmente problemas de software, e não de hardware), por isso não vou "jurar" que nenhum problema aconteceria, mas as possibilidades são pequenas.

Mas no caso do seu código, no modo como está feito, como certeza, não há perigo nenhum. Como você fez usando uma variável int e, como eu disse, o limite da variável int é 2147483647, ao chegar nesse valor e a somar mais 1, você vai "resetar" a variável para o valor -2147483648 e a soma continuará, assim, infinitamente.

Ou seja, o loop pode estar infinito, mas a contagem não será infinita. Depois de um tempo, ele vai resetar.

A variável int deve ocupar sempre 4 bytes de memória, não importa o valor que esteja lá dentro.

Ou seja, pode deixar o seu computador somando pra sempre na variável int que o espaço ocupado pela memória deve ser constante (a não ser quanto espaço ocupado pra exibir graficamente o número na tela. Mas, no windows, por exemplo, a janela do cmd não guarda linhas infinitas. Existe um limite, justamente pra não sobrecarregar a memória).

Pra que a contagem não resete nunca, você teria que usar, então, alguma daquelas bibliotecas para números infinitos.

Caso faça isso, aí ele deve continuar somando e ocupando cada vez mais memória. Mas imaginando que seu computador tenha uns 2GB ou 4GB de memória (o que já é até pouco nos dias de hoje), você deve levar muito tempo pra ocupar tudo isso, imagino que seja questão de semanas.

Bom, acho que o maior transtorno que isso deveria causar seria que, pouco a pouco, o sistema vai ficando cada vez mais lento, chegando ao ponto de que programas não possam mais ser abertos por falta de memória, até acontecer, então, que o seu próprio programa não consiga mais funcionar.

Nesse momento, acredito, então, que seu programa deve ser fechado pelo SO, o que vai fazer com que toda a memória que você ocupou seja liberada, e possivelmente, o SO continue funcionando.

Entretanto, não descarto a possibilidade do SO travar, te obrigando a reiniciar o PC. Esse deve ser o maior problema a acontecer.

Fora isso, sobre seu código, daria para simplificá-lo... Por exemplo, a variável a1 seria desnecessária.

Pra fazer um loop infinito, é só escrever while(true)

Hum... acho que eu já devia ter te falado no primeiro post, né?? Acho que era isso que você queria saber desde o começo...

Link to comment
Share on other sites

  • 0

Infelizmente não conheço essa função, while(true), embora a tenha visto coincidentemente a alguns minutos num vídeo sobre python.

O que me vem a cabeça é, enquanto "o que" for verdadeiro?

Já sobre o programa em si, eu poderia escrever para uma progressão geométrica, ao invés de aritmética, o que tornaria a progressão bem mais rápida.

No entanto, creio ainda não ter entendido uma coisa: todas as saídas ficam salvas na memória, no caso desse código, desde n=0, ou é liberada memória assim que aparece uma saída diferente? Acho que essa dúvida pode não ter ficado muito clara...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...