Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

Josesousa

Membros Plenos
  • Total de itens

    113
  • Registro em

  • Última visita

  • Qualificações

    N/D
  1. @isrnick Isso é para o lixo de memoria?
  2. @isrnick Foi isso que achei massa da funcao, é que de inicio me perdi um pouco. Agora colocando para rodar o programa , nao rodou não. Mas de qualquer forma, obrigado a todos aí.....
  3. Para mim era mais intuitivo trabalhar usando ponteiro para ponteiro pois estavos fazendo algo similar (ponteiro para inteiro) no vetor. @AnsiC Por isso que não estava entendendo o link que voce enviou, pois lá, se me recordo, não falava sobre criar dinamicamente diretamente. Fora nas pesquisas que fiz encontrei somente usando de ponteiro para ponteiro. Sobre a funcao libera eu cheguei a modificar o meu aqui. Colocando num for, so que parece que liberaria so a segunda dimensao, baseando no codigo do @giu_d @isrnick Nome de funcao estranha, ainda mais com esses paranteses separando ele do seu tipo. Parece uma matriz, ainda mais com esses colchetes no final. E aqui embaixo voce não colocou o igual lá em cima (sem o * e o parenteses). São tantas nuances. MAS LEGAL SABER DESSA POSSIBILIDADE.
  4. @devair1010 Quando se eleva uma matriz a pontecia nao seria multiplicar ela por ela mesma ate a pontencia desejada?
  5. @iHollyZinhO Nunca precisei usar a tabela Ascii, mas me tira uma dúvida. Quando a usamos precisamos declarar uma biblioteca ou bastaria apenas somar os valores como voce fez ai .(claro, tendo o conhecimento da mesma)?
  6. @Lucas Tezolini Herler Boa tarde. Pois bem, para resolver o problema bastaria uma funcao. Nessa única funcao voce vai passar as variaveis a e b por referencia, ou seja, usando o &. Dentro da funcao foi cria uma variavel temporia e pronto. main(){ int a,b; .... /// Desenvolve o seu codigo aqui, lendo as variaveis void troca(int *a, int *b); troca(&a,&b); } void troca(int *a, int *b){ int tem; tem= *b; *b=*a; *a=tem; }
  7. @AnsiC Acho que entendi. No caso um ponteiro aponta apenas para o primeiro elemento da matriz, ai teria que faze-lo apontar para a matriz inteira. * (* (arr + i) + j) = e a funcao malloc......ou calloc... adicionado 6 minutos depois Entao eu estava alocando parte a parte, e não diretamente.
  8. @AnsiC Na verdade não (Em parte, somente). Não entendi muito bem o que voce quis dizer. voce se referia a mat que é aritmetica de ponteiros? E sobre essa de arranjo ser diferente de ponteiro para ponteiro, não sei. No caso teria que resolver usando ponteiro para ponteiro não? Que seria um arranjo. Esse ponterio nao vai apontar para um bloco e desse bloco cada pedaco (ponteiro) apontara para uma linha da matriz? Usei o seguinte site -> https://www.pucsp.br/~so-comp/cursoc/aulas/ca70.html , e conseguir resolver meu problema, eu acho. A parte que mudei. A diferenca que declarei o ponteiro para ponteiro na funcao. E usei calloc. mat = (int **) calloc (m, sizeof(int *)); for ( i = 0; i < m; i++ ) { mat[i] = (int*) calloc (n, sizeof(int)); /* m vetores de n floats */ if (mat[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } } voce poderia me tirar outra duvida. Qual a diferenca e malloc e calloc, alem do prototico. Pois parece que fazem a mesma coisa. So que o calloc zera quando aloca alguma coisa.
  9. Bom dia. Como vão? Estava a resolver um exercício de alocação dinamica, so que dessa vez de matriz. Mas o conceito não entrou muito bem não. No vetor criamos um ponteiro que ira apontar para um espaço, e entao alocamos certa quantidade desse espaço usando o malloc (e sizeof). Já na matriz fariamos como? Eu seguindo um video aqui do youtube entendi que deve ser declarado um ponteiro para ponteiro, e que apontará para um espaço de memoria, como num vetor, e desse cada espaço apontará para uma certa quantidade. Não sei se deu para entender. (Não sei se pode deixar o link do video aqui, mas so pesquisa alocação de matriz.) Acredito que o conceito nao seja exatamente esse. Deixarei o codigo abaixo, se puderem olhar. Nele funciona normalmente quando é colocado um numero diferente de 1 na coluna ou na linha, (isso depende de como eu fiz o segundo malloc, ESTARÁ COMENTADO ESSA PARTE NO CODIGO). #include <stdio.h> #include <stdlib.h> /**3. Construa um programa (main) que aloque em tempo de execução (dinamicamente) uma matriz de ordem m x n(linha por coluna), usando 1+m chamadas a função malloc. Agora, aproveite este programa para construir uma função que recebendo os parametros m e n aloque uma matriz de ordem m x n e retorne um ponteiro para esta matriz alocada. Crie ainda uma função para liberar a área de memória alocada pela matriz. Finalmente, crie um novo programa (main) que teste/use as duas funções criadas acima.*/ /// Protóticos das funções. int **aloca_matriz(int **mat,int m, int n); void libera_matriz(int **mat); main(){ int **mat = NULL, m, n, i, j; printf("Quantas linhas a matriz tera? "); scanf("%d", &m); printf("Quantas colunas a matriz tera? "); scanf("%d", &n); mat=aloca_matriz(mat,m, n); ///Preenchendo a matriz. for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: ", i,j); scanf("%d", &mat[i][j]); } } ///Imprimir na tela o resultado!!! printf("\n\nAgora sera impresso na tela o resultado.\n"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: %d.\n", i,j,mat[i][j]); } } ///Liberando o espaco usado pela matriz alocada. libera_matriz(mat); /*printf("\n\nAgora sera impresso na tela o resultado apos libera-los.\n"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz [%d][%d]: %d.\n", i,j,mat[i][j]); } }*/ return 0; } int **aloca_matriz(int **mat,int m, int n){ int i,j; ///Aloco vetor principal mat = (int **) malloc(m * sizeof(sizeof(int *))); ///Aloca matriz for(i=0;i<n;i++){ //for(j=0;j<n;j++){ mat[i] = (int *) malloc(n * sizeof(int)); /// AQUI JÁ APARECE ERRO POR NAO CONSEGUIR COLOCAR 1 NA COLUNA. AQUI SE MUDAR O n * sizeof , POR M * ... APARECE PROBLEMA SE EU COLOCAR 1 NA LINHA, //} } return mat; } void libera_matriz(int **mat) { free(mat); }
  10. Eu tinha para mim que vetor sempre era um ponteiro, então sempre ia retornar ponteiro. ( Mas nem passou na minha cabeca isso de colocar a função como int *, interessante isso, pensave que na ora do return que eu mudaria a forma que seria retornado, colocando * ou & , ,,,,,cada coisa.) Quando estava aprendendo sobre funcao, no inicio eu fazia isso. Alias, quase isso, pois eu colocava so o nome da funcao e deixava o paranteses sem nada . kkkk (mas nunca deu problemas em rodar os exercicios, hoje sei que esta errado) Foi mal o tanto de pergunta ai, é que nao sabia mesmo. rsrsrs Muito obrigado, @giu_d . Esta me ajudando muito .
  11. @giu_d Porque que nessa parte não está igual como na função, com os nomes das variaves? Toda vez que for criar uma funcao que aloca dinamicamente uma vetor ela tem que ter o '*' nela? adicionado 4 minutos depois Pensei tambem que quando alocava uma variavel seguia esse padrão: variavel = (tipo *) malloc (tamanho * sizeof (tipo); No caso você não usou o primeiro parenteses acima adicionado 15 minutos depois @isrnick Porque que multiplica pelo vetor direto (logo apos o sizeof), e não o tipo? (esse retorno eu teria que atribuir a outra variavel para poder usar,ne)
  12. Bom dia, como vão? (Vou bem) Estou com dificuldades para criar um vetor, dinamicamente no caso, dentro de uma função. Segue o codigo e apos ele algumas observacoes que percebi. /**Faça uma função que receba um valor n e crie dinamicamente um vetor de n elementos e retorne um ponteiro. Crie uma função que receba um ponteiro para um vetor e um valor n e imprima os n elementos desse vetor. Construa também uma função que receba um ponteiro para um vetor e libere esta área de memória. Ao final, crie uma função principal que leia um valor n e chame a função criada acima. Depois, a função principal deve ler os n elementos desse vetor. Então, a função principal deve chamar a função de impressão dos n elementos do vetor criado e, finalmente, liberar a memória alocada através da função criada para liberação.*/ #include <stdio.h> #include <stdlib.h> main(){ int n,*vet, i; printf("Informe o tamanho do vetor: "); scanf("%d", &n); int criar(int *vet, int n); criar(vet,n); printf("\nPreencha o vetor agora.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: ",i); scanf("%d", &vet[i]); } void imprima(int *vet, int n); imprima(vet, n); void libera(int *vet); libera(vet); printf("\nO vetor depois de liberar.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: %d\n", i,vet[i]); } } int criar(int *vet, int n){ vet =(int *) malloc(n * sizeof(int)); return *vet; } void imprima(int *vet, int n){ int i; printf("\nO vetor ficou da seguinte forma.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: %d\n", i,vet[i]); } } void libera(int *vet){ free(vet); } Pois bem, se na funcao principal eu criar um vetor de forma normal, e não um ponteiro para depois ser criado um vetor dinamicamente, vai funcionar perfeitamente. So que no caso acredito que assim não seja possivel criar de forma dinamica.. A forma abaixo é o vetor criado normalmente e que funciona no exercicio. main(){ int n=2, vet[n],i; .... } So que depois de char a a função liberar, que faz uso do free(), continua a mostrar os mesmos valores, como se nao ouvesse sido liberada. E na primeira forma (a que nao da certo) eu não consigo nem ler o vetor na funcão principal.
  13. @giu_d Valeu. Deu para entender sim. So uma coisa o formatador de saída não é o -> %p , para o endereco de memoria ? Obs: no incio achei que o meu estava errado, pois so anulava o dois primeiro numero, e o resto se repetia igual.
  14. @AnsiC @giu_d Deixe-me ver então. QUer dizer que depois de usar o free, a variavel não é anulada. Quando perguntamos porque não estava dando certo a ele, ele simplesmente não respondeu, e olha que ninguem na sala conseguiu. Estavamos fazendo exercicios simples depois de cada pequena parte que ele explicava. Que no caso eram sobre alocação (malloc, calloc, realloc, free). O free não deve ser usado depois que alocar algo dinamicamente, para liberar memoria (ou algo assim).??????? So sei que ele disse que não deveria mostrar nada, que daria erro. Mas, em algum momento, ele disse sobre zerar. Acredito que deveria mostrar lixo na memoria, que é o que o porgrama esta fazendo ( EU ACHO), mas não sei se esta certo (alias nem dos programas que fiz de alocação kkkkk , perguntei a professor como era para ser a resposta dos outros programas e ele disse : Se você fez tudo certo,então esta certo, chato isso pois não sei se estou indo pro caminho certo)
  15. Boa noite, como estão? O professor estava a explicar sobre alocação dinamica de memoria, no entanto quando ele propos um exercicio com o uso da funcao free que quando resolvermos ele não librerou a memoria como deveria ter sido feito segundo o professor. No caso perguntamos porque nao deu certo e ele nao respondeu (ate onde vi todos falaram que nao deu certo). Era para aparecer 0 (zero) segundo o professor. Segue o codigo,, se puderem olhar e apontar o erro. #include <stdio.h> #include <stdlib.h> // NECESSARIA !!!! main(){ int a, *p, i; printf("Digite valor de a: "); scanf("%d", &a); p = (int *)malloc(a*sizeof(int)); if(!p){ printf("ERRO: MEMORIA INSUFICIENTE!"); exit; } for(i=0;i<a;i++){ p[i]=i*i; } for(i=0;i<a;i++){ printf("Vetor p[%d]: %d\n", i, p[i]); } printf("\n\nAhora depois de deixar de apontar para o p.\n"); free(p); for(i=0;i<a;i++){ printf("Vetor p[%d]: %d\n", i, p[i]); /// ERA AQUI QUE ERA PARA MOSTRAR ZERO, SEGUNDO O TEACHER. } return 0; } OBS: Ele me disse que o free nao apaga, mas faz com que o ponteiro deixe de apontar para ele (a variavel que ele apontava).

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×