Gestão de Memória (exemplo com pilha): Difference between revisions
From Wiki**3
No edit summary |
|||
| (2 intermediate revisions by the same user not shown) | |||
| Line 9: | Line 9: | ||
for (ax = 1; ax < argc; ax++) { | for (ax = 1; ax < argc; ax++) { | ||
char *arg = argv[ax]; | char *arg = argv[ax]; | ||
printf("Vou guardar o % | printf("Vou guardar o %dº argumento: %s... \t", ax, arg); | ||
if (push(arg) != FALHA) printf("consegui!!\n"); | if (push(arg) != FALHA) printf("consegui!!\n"); | ||
else { | else { | ||
| Line 20: | Line 20: | ||
if (!falhei) printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", | if (!falhei) printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", | ||
nframes()); | nframes()); | ||
else printf("Não consegui guardar a partir do % | else printf("Não consegui guardar a partir do %dº argumento (%s).\n", | ||
ax, argv[ax]); | ax, argv[ax]); | ||
} | } | ||
A função <code>main</code>, depois de processar os dados de entrada (ver acima), apresenta o | A função <code>main</code>, depois de processar os dados de entrada (ver acima), apresenta o conteÃ?ºdo da pilha de armazenamento. Notar o uso de <code>free</code> (a reserva -- com <code>malloc</code> -- foi efectuada durante a operação <code>[[Pilha de Strings (controlo de falha)|push]]</code>). | ||
int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
| Line 51: | Line 51: | ||
Sou ./sstack1, uma pilha de 'strings'. Capacidade: 1024 'strings'. | Sou ./sstack1, uma pilha de 'strings'. Capacidade: 1024 'strings'. | ||
Há 7 argumentos na linha de comandos... | Há 7 argumentos na linha de comandos... | ||
Vou guardar o | Vou guardar o 1º argumento: 111... consegui!! | ||
Vou guardar o | Vou guardar o 2º argumento: 222... consegui!! | ||
Vou guardar o | Vou guardar o 3º argumento: 333... consegui!! | ||
Vou guardar o | Vou guardar o 4º argumento: 444... consegui!! | ||
Vou guardar o | Vou guardar o 5º argumento: 555... consegui!! | ||
Vou guardar o | Vou guardar o 6º argumento: 666... consegui!! | ||
Vou guardar o | Vou guardar o 7º argumento: 777... consegui!! | ||
Uff! Guardei tudo: a pilha tem 7 elementos. | Uff! Guardei tudo: a pilha tem 7 elementos. | ||
Li da pilha: 777 | Li da pilha: 777 | ||
| Line 73: | Line 73: | ||
Sou ./sstack1, uma pilha de 'strings'. Capacidade: 5 'strings'. | Sou ./sstack1, uma pilha de 'strings'. Capacidade: 5 'strings'. | ||
Há 7 argumentos na linha de comandos... | Há 7 argumentos na linha de comandos... | ||
Vou guardar o | Vou guardar o 1º argumento: 111... consegui!! | ||
Vou guardar o | Vou guardar o 2º argumento: 222... consegui!! | ||
Vou guardar o | Vou guardar o 3º argumento: 333... consegui!! | ||
Vou guardar o | Vou guardar o 4º argumento: 444... consegui!! | ||
Vou guardar o | Vou guardar o 5º argumento: 555... consegui!! | ||
Vou guardar o | Vou guardar o 6º argumento: 666... falhei! Vou ignorar os restantes 2 argumentos. | ||
Não consegui guardar a partir do | Não consegui guardar a partir do 6º argumento (666). | ||
Li da pilha: 555 | Li da pilha: 555 | ||
Li da pilha: 444 | Li da pilha: 444 | ||
| Line 91: | Line 91: | ||
'''prompt%''' echo $status | '''prompt%''' echo $status | ||
73 | 73 | ||
== Ver Também == | |||
* [[Gestão de Memória (pilha elástica)]] | |||
Latest revision as of 09:09, 12 November 2008
Este exemplo faz uso de uma pilha de strings para armazenar dados lidos da linha de comando.
A função processa_linha_de_comandos processa e armazena os dados de entrada.
void processa_linha_de_comandos(int argc, char **argv) {
unsigned ax;
unsigned char falhei = 0;
printf("Há %d argumentos na linha de comandos...\n", argc-1);
for (ax = 1; ax < argc; ax++) {
char *arg = argv[ax];
printf("Vou guardar o %dº argumento: %s... \t", ax, arg);
if (push(arg) != FALHA) printf("consegui!!\n");
else {
printf("falhei! Vou ignorar os restantes %d argumentos.\n",
argc - ax);
falhei = 1;
break;
}
}
if (!falhei) printf("Uff! Guardei tudo: a pilha tem %d elementos.\n",
nframes());
else printf("Não consegui guardar a partir do %dº argumento (%s).\n",
ax, argv[ax]);
}
A função main, depois de processar os dados de entrada (ver acima), apresenta o conteÃ?ºdo da pilha de armazenamento. Notar o uso de free (a reserva -- com malloc -- foi efectuada durante a operação push).
int main(int argc, char *argv[]) {
char *ptr = NULL;
printf("Sou %s, uma pilha de 'strings'. Capacidade: %d 'strings'.\n",
argv[0], TAMANHO);
processa_linha_de_comandos(argc, argv);
while ((ptr = pop())) {
printf("Li da pilha: %s\n", ptr);
free(ptr); /* liberta memória reservada com 'malloc' em 'push'!! */
}
printf("Hmm! Li tudo: a pilha ficou com %d elementos.\n", nframes());
return 73;
}
O programa pode ser compilado da seguinte forma (assume-se que sstack1.c contém a pilha e o programa acima).
prompt% gcc -ansi -pedantic -Wall -o sstack1 sstack1.c
O resultado da execução do programa acima com TAMANHO (a dimensão máxima da pilha) igual a 1024 é o seguinte:
prompt% ./sstack1 111 222 333 444 555 666 777 Sou ./sstack1, uma pilha de 'strings'. Capacidade: 1024 'strings'. Há 7 argumentos na linha de comandos... Vou guardar o 1º argumento: 111... consegui!! Vou guardar o 2º argumento: 222... consegui!! Vou guardar o 3º argumento: 333... consegui!! Vou guardar o 4º argumento: 444... consegui!! Vou guardar o 5º argumento: 555... consegui!! Vou guardar o 6º argumento: 666... consegui!! Vou guardar o 7º argumento: 777... consegui!! Uff! Guardei tudo: a pilha tem 7 elementos. Li da pilha: 777 Li da pilha: 666 Li da pilha: 555 Li da pilha: 444 Li da pilha: 333 Li da pilha: 222 Li da pilha: 111 Hmm! Li tudo: a pilha ficou com 0 elementos.
Uma outra execução, mas com TAMANHO redefinido com o valor 5.
prompt% ./sstack1 111 222 333 444 555 666 777 Sou ./sstack1, uma pilha de 'strings'. Capacidade: 5 'strings'. Há 7 argumentos na linha de comandos... Vou guardar o 1º argumento: 111... consegui!! Vou guardar o 2º argumento: 222... consegui!! Vou guardar o 3º argumento: 333... consegui!! Vou guardar o 4º argumento: 444... consegui!! Vou guardar o 5º argumento: 555... consegui!! Vou guardar o 6º argumento: 666... falhei! Vou ignorar os restantes 2 argumentos. Não consegui guardar a partir do 6º argumento (666). Li da pilha: 555 Li da pilha: 444 Li da pilha: 333 Li da pilha: 222 Li da pilha: 111 Hmm! Li tudo: a pilha ficou com 0 elementos.
O retorno da função main pode ser avaliado através da variável $status (do shell).
prompt% echo $status 73