gRoOvE 0 Denunciar post Postado Julho 3, 2008 Faça um programa usando ponteiros, para ordenar 5 números emostrálos ordenados na tela. ae galera, preciso de ajuda nesse exercício, não sei nem por onde começar e qual a lógica disso "/ Sei fazer apenas da forma normal, sem uso de ponteiros Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 3, 2008 int V[5] = {4,2,6,-4,3}; é o mesmo que int *V = (int*)malloc(5); V[0] = 4; V[1] = 2; V[2] = 6; V[3] = -4; V[4] = 3; Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 3, 2008 nossa Isis, teu processador é de 8bits? :) zuera ^^ o correto não seria malloc(24)? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 3, 2008 ja que ta reclamando use sizeof entao. e o teu ta tao errado quanto o meu. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 3, 2008 haeuahasueiuashuae tava só zuando po :D Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 4, 2008 acho que contei errado, 20 o correto?? int *V = (int*)malloc(5);uma coisa, tenho sempre que usar o casting no malloc ali ?? no ponteiro não precisa definir o tipo denovo né?? E esse * ali no ponteiro, porque?peguei isso de outro lugar ae: char *ptr; ptr = malloc (1); scanf ("%c", ptr); O endereço devolvido por malloc é do tipo "genérico" void *. O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo acima, o endereço é armazenado num ponteiro-para-char. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 4, 2008 Tem compilador que reclama se você nao usar o cast. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 4, 2008 hmm, voltando ao assunto, tenho que comparar a váriavel ou o seu endereço? Fiz com a váriavel, mas acho que não é isso "/ #include <stdio.h> #include <stdlib.h> int main(void) { int *v; int num; int i,k, aux; v = (int*)malloc(5 * sizeof(int)); for(i=0;i<5;i++) { printf("Digite um valor para V[%d]: ",i); scanf("%d",v+i); } for(i=0;i<5;i++) { for(k=i+1;k<5;k++) { if(v[i] > v[k]) { aux = v[i]; v[i] = v[k]; v[k] = aux; } } } for(i=0;i<5;i++) { printf("\nValor de V[%d] = %d",i,v[i]); } return(1); } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 5, 2008 A gente verifica o retorno do malloc antes de usar...Nunca assuma que o sistema está usando pouca memória ou que tem memória de sobra.Se o limite de memória que o SO cede automaticamente a uma requisição for estourado, o malloc vai retornar NULL e vai dar falha de segmentação.É assim que funciona no Linux.Tente rodar esse programa no windows via terminal: #include <stdio.h> #include <stdlib.h> int main (void) { int n = 0; while (1) { if (malloc(1<<20) == NULL) { printf("malloc failure after %d MiB\n", n); return 0; } printf ("got %d MiB\n", ++n); } } No suse da máquina virtual o malloc falha em 800MB. Existem dois arquivos em /proc/sys/vm/ que controlam esse comportamento.Por padrão,o overcommit_memory vem setado com 0,mas o efeito disso depende da versao do kernel.Isso é o podre de C: você tem que saber como o SO funciona. E scanf("%d",v+i); pode ser escrito como &v. Além disso,teu programa tem memory leak por não dar free no ponteiro. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 5, 2008 tentei rodar esse code ae, ele executa e fexa a janela, mesmo dando system("pause") e getch(). Vou fazer a verificação de memória antes e liberar depois que usar então. O que é memory leak? Porque usar o & na leitura do vetor? Não funciona somente v? seria isso? Não intendi a vantagem de fazer isso usando ponteiros, se é que tem alguma... #include <stdio.h> #include <stdlib.h> int main(void) { int *v; int num; int i,k, aux; v = (int*)malloc(5 * sizeof(int)); if(v == NULL) { printf("\nEspaco em memoria insuficiente!"); exit(1); } for(i=0;i<5;i++) { printf("Digite um valor para V[%d]: ",i); scanf("%d",v+i); } for(i=0;i<5;i++) { for(k=i+1;k<5;k++) { if(v[i] > v[k]) { aux = v[i]; v[i] = v[k]; v[k] = aux; } } } for(i=0;i<5;i++) { printf("\nValor de V[%d] = %d",i,v[i]); } return(1); free(v); v = NULL; } Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 16, 2008 seria isso? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 16, 2008 E precisa ter vantagem pra entender como funciona uma estrutura da linguagem? Se você faz esse tipo de pergunta entao provavelmente pra você o exercicio é somente ordenar um vetor. for(i=0;i<5;i++) free(lista+i); *** glibc detected *** ./a.out: free(): invalid pointer: 0x0804b00c ***======= Backtrace: ========= /lib/libc.so.6[0xb7fa8fc4] /lib/libc.so.6(cfree+0x9c)[0xb7faa95c] ./a.out[0x8048600] /lib/libc.so.6(__libc_start_main+0xe5)[0xb7f535f5] ./a.out[0x8048411] ======= Memory map: ======== 08048000-08049000 r-xp 00000000 08:01 15155206 /home/isis/src/a.out 08049000-0804a000 r--p 00000000 08:01 15155206 /home/isis/src/a.out 0804a000-0804b000 rw-p 00001000 08:01 15155206 /home/isis/src/a.out 0804b000-0806c000 rw-p 0804b000 00:00 0 [heap] b7e00000-b7e21000 rw-p b7e00000 00:00 0 b7e21000-b7f00000 ---p b7e21000 00:00 0 b7f21000-b7f2d000 r-xp 00000000 08:01 8446047 /lib/libgcc_s.so.1 b7f2d000-b7f2e000 r--p 0000b000 08:01 8446047 /lib/libgcc_s.so.1 b7f2e000-b7f2f000 rw-p 0000c000 08:01 8446047 /lib/libgcc_s.so.1 b7f3c000-b7f3d000 rw-p b7f3c000 00:00 0 b7f3d000-b807a000 r-xp 00000000 08:01 8445965 /lib/libc-2.8.so b807a000-b807c000 r--p 0013d000 08:01 8445965 /lib/libc-2.8.so b807c000-b807d000 rw-p 0013f000 08:01 8445965 /lib/libc-2.8.so b807d000-b8081000 rw-p b807d000 00:00 0 b808d000-b808e000 rw-p b808d000 00:00 0 b808e000-b80a9000 r-xp 00000000 08:01 8445958 /lib/ld-2.8.so b80a9000-b80aa000 r--p 0001a000 08:01 8445958 /lib/ld-2.8.so b80aa000-b80ab000 rw-p 0001b000 08:01 8445958 /lib/ld-2.8.so bfc95000-bfcaa000 rw-p bffeb000 00:00 0 [stack] ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso] Abortado for(i=0;i<5;i++) lista+i = random(); ordenacao.c: In function ‘main’:ordenacao.c:10: error: lvalue required as left operand of assignment O tempo de execucao depende dos processos da maquina mas entre realocar um pedaco de memoria inteiro e criar um outro array pra copiar os dados um por um, qual dos dois você acha que é mais rápido? Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 17, 2008 sem dúvida, mexendo apenas no endereço é mais rápido. Mas como eu faço pra realocar ao invés de usar a variável adicional? Não entendi esses codes que você postou "/ Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 17, 2008 Use realloc. Cara,quando a gente nao entende, a gente senta e roda a implementacao do outro.Mas roda acompanhando. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 17, 2008 Não tenho noção nenhuma de como fazer, se não tiver uma ajuda fica dificil. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 17, 2008 Primeiro que ponteiros não é fazer meia duzia de exercicios so por fazer. Depois, é só um caso de prestar atencao no proprio codigo pra perceber que o que eu escrevi foram modificacoes em partes do que você postou. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 19, 2008 mas não quero fazer meia duzia de exercícios por fazer, resolvi errado, por isso não vi vantagem alguma. Não estou conseguindo entender a lógica de usar ponteiros pra resolver. Teria que comparar o elemento na posição 0 com o elemento da posição 1 e ver qual o maior? Mas como fazer isso sem usar uma variável auxiliar? Li sobre o realloc, a única coisa que ele faz é aumentar o tamanho da memória reservada após usar o malloc, ta e dai? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 19, 2008 Vantagem você so vai ver quando tiver que usar realmente. Comece a programar um editor de texto p/ ver que *legal* é usar arrays quando se quer mudar a posição de uma linha... Li sobre o realloc, a única coisa que ele faz é aumentar o tamanho da memória reservada após usar o malloc, ta e dai? Mas como eu faço pra realocar ao invés de usar a variável adicional? você falou em realocar. Realocar => memoria e não variavel auxiliar. Se fosse python dava pra você ter a= 43, b = 6 e fazer a,b = b,a. Mas isso é C. quando tiver que trocar valores de lugar você sempre vai precisar de outra variável. Exercicios sobre ponteiros não querem que você invete tecnicas obscuras de programacao. O básico já é confuso. É só entender como usar. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Julho 19, 2008 Então, vejamos, pego o endereço de memória 002560, digamos que seja o primeiro elemento(0), comparo com o próximo elemento(1), que tem o endereço de memória 002564 (considerando int = 4bytes), caso o elemento 1 seja menor que o elemento 0, tenho que realocar o bloco de memória dai? ficando assim: 002564 = elemento 0 002560 = elemento 1 ta difícil entender isso "/ Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 19, 2008 Mais uma vez: realocar é redimensionar memória reservada. você não vai realocar nada a não ser que queira inserir mais coisas no array. Compartilhar este post Link para o post Compartilhar em outros sites