Ir para conteúdo
Fórum Script Brasil
  • 0

Pilha Do So


William Rodrigues

Pergunta

Salve!

estou com algumas dificuldades de como fazer uma simulação da Pilha do SO. Tipo, tem que salvar o endereço de retorno, as variáveis passadas e tal.

Brothers, tá foda essa parada.

Pilha normal eu entendo e consigo fazer a sua implementação.

Mas, descobrir o tamanho mínimo para ela (para que não ocorra Overflow) e fazer essa simulação é que é difícil.

Se alguém puder me ajudar com explicações ou algum material falando sobre simulação de Pilhas, Pilhas do SO ou algo de ajude agradeço.

Valeu rapaziada!

Abraços,

William Rodrigues

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Opa, William, tá sumido, hein? :)

Overflow do tamanho da pilha? Se for, por que não fazer uma pilha com alocação dinâmica? Uma lista circular serviria.

Mas, explique melhor o que você quer dizer com "pilha do SO", porque eu não encontrei nada a respeito desse assunto.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Salve!

É, estou super sumido mesmo...

Ah, antes de mais nada, parabéns pela mais nova moderação em Visual Basic cara, mais do que merecida ;)

Então, tenho que fazer a simulação da Pilha, controlada pelo SO, em uma função recursiva. Tenho que armazenar o endereço para retorno (controle das chamdas) e as variáveis passadas.

O tamanho da Pilha descobri fazendo a árvore de recursão. A Pilha, faço com um struct colocando o endereço e os parâmetros passados.

O que estou com dificuldades seria para fazer o controle sobre o endereço (como fazer o controle em um função recursiva).

Meio complicado ainda né?

Abraços,

William Rodrigues

Link para o comentário
Compartilhar em outros sites

  • 0

Salve!

É, estou super sumido mesmo...

Ah, antes de mais nada, parabéns pela mais nova moderação em Visual Basic cara, mais do que merecida ;)

Obrigado! :D

Então, tenho que fazer a simulação da Pilha, controlada pelo SO, em uma função recursiva. Tenho que armazenar o endereço para retorno (controle das chamdas) e as variáveis passadas.

O tamanho da Pilha descobri fazendo a árvore de recursão. A Pilha, faço com um struct colocando o endereço e os parâmetros passados.

O que estou com dificuldades seria para fazer o controle sobre o endereço (como fazer o controle em um função recursiva).

Meio complicado ainda né?

Sim, ainda está complicado... rsrsrs. Mas, que tipo de "controle" você quer ter sobre o endereço?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Salve!

Realmente ficou e ainda está complicado! :D

Queria apenas uma referência, uma identificação da chamada. Seria algo mais ou menos assim.

função (parametro1)
/* aqui tenho que alocar o endereço da chamada (identificação) e os parametros passados */
Pilha.Endereco = "chamada 1"
Pilha.Parametro1 = valor

função (tipo parametro1) {
/* rotina da função */
}

Só que a função ela é recursiva, ou seja, vou ter que empilhar o endereço (identificador) da chamada e os parametros a serem passados.

Só que não sei o tipo de tratamento ou como fazer a identificação do processo quando chegar ao caso trivial na função recursiva.

Ficou mais claro brother?

Valeu pela força!

Abraços,

William Rodrigues

Link para o comentário
Compartilhar em outros sites

  • 0

Hummm... está melhorando! :D Só para fica mais claro ainda: você sabe qual seria o caso trivial (e não está conseguindo implementar) ou é justamente isso (qual é o caso) que é a sua dúvida?

Espero estar ajudando!

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

hehehe...

Sei sim, seria para a Função MergeSort.

Merge(Lista, inicio, final) {
int meio;
if (inicio < final) {
meio = (inicio + final) / 2;
MergeSort(L, inicio, meio);
MergeSort(L, meio + 1, final);
Intercala(L, inicio, meio, final);
}
}

No que puder me ajudar agradeço brother.

Valeu cara!

Abraços,

William Rodrigues

Link para o comentário
Compartilhar em outros sites

  • 0

Ih... heheheh... complicou de novo. Você quer ordenar a pilha? Mas, ordenar pelo quê?

Você poderia dar um exemplo prático de como funcionaria essa pilha do SO? O que entra, o que sai, bláblá...; qualquer exemplo serve, só pra ter um idéia.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

hehehehe...certo...

Achei um exemplo bem fácil. Fazendo a função recursiva do Fatorial e inspecionando a variável passada com argumento para a função recursiva, você notará que ela mudará de valor a cada chamada da função, seria isso que eu tenho que fazer com a minha pilha. Seria armazenar esses valores para quando a função recursiva chegar no caso trivial eu possa desempilhar esses caras e obter os valores. Sacou? ;) (--> by: Graymalkin)

hehehe...

Abraços,

William Rodrigues

Link para o comentário
Compartilhar em outros sites

  • 0

hehehehe...certo...

Achei um exemplo bem fácil. Fazendo a função recursiva do Fatorial e inspecionando a variável passada com argumento para a função recursiva, você notará que ela mudará de valor a cada chamada da função, seria isso que eu tenho que fazer com a minha pilha. Seria armazenar esses valores para quando a função recursiva chegar no caso trivial eu possa desempilhar esses caras e obter os valores. Sacou? ;) (--> by: Graymalkin)

hehehe...

Hehehehe... gostei do "Sacou? ;) (--> by: Graymalkin)"... e sim saquei! Mas, não seria só uma questão de passar a pilha para a função? Uma fez que ela é uma referência, não se perderiam os valores que foram adicionados anteriormente. Já que você citou o caso de uma função para calcular fatorial, fiz um exemplo com ela:

#include <stdlib.h>
#include <stdio.h>
#include <stack>

using namespace std;

int fatorial(int i, stack<int> pilha)
{
    if (i==0 || i==1)
       {
           while (!pilha.empty())
           {
               printf("\nDesempilhando: %i", pilha.top());
               pilha.pop();
           }
           return 1;
       }
    else
    {
       pilha.push(i);
       return i*fatorial(i-1, pilha);
    }
}

int main()
{
    stack<int> pilha;

    printf("\nResultado: %i\n", fatorial(5, pilha));
    system("pause");
}

Note que ao chegar no caso trivial da função fatorial (if (i==0 || i==1)) eu mostro todos os valores que passaram pela função antes. É claro que se eu quisesse eles na mesma ordem que foram passados (5, 4, 3, etc.) bastaria passar os valores para outra pilha (resultando na inversão da pilha).

Seria isso mesmo ou eu viajei?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...