Jump to content

guidjos

Members
  • Content count

    646
  • Joined

  • Last visited

  • Days Won

    2

guidjos last won the day on April 7 2015

guidjos had the most liked content!

Community Reputation

65 Bom

7 Followers

About guidjos

Informações Pessoais

  • Sexo
    Masculino

Recent Profile Visitors

4570826 profile views
  1. guidjos

    Oq é 'void'? Pra que serve e quando usa-lo?

    Cuidado: void não é um valor. Veja o post da Isis.
  2. guidjos

    usar ponteiros diminui o tempo de execução?

    Não existe mágica, então a resposta é que depende do caso de uso. Um exemplo simples em que isso seria verdade é se você tivesse uma estrutura de dados muito grande. O que vc acha que é mais rápido: duplicar toda a informação (ou seja, ter duas cópias de tudo) ou manipular um ponteiro para ela? Em alguns cenários o inverso ocorre: o uso de ponteiro requer, necessariamente, uma operação a mais para avaliar uma expressão. Claro, isso tudo desconsidera otimização que a implementação possa fazer. Lembre-se de que os compiladores/interpretadores só precisam se comportar conforme a definição da linguagem.
  3. guidjos

    Comparação ponteiro

    Sugiro que use uintptr_t, se estiver disponível na sua implementação.
  4. guidjos

    Função em C

    Pra chamar a função "f" sobre os argumentos "m" e "n", nessa ordem, é só dizer f(m, n). A primeira pergunta eu não entendi.
  5. guidjos

    Retornando ponteiro de vetor

    Seu vetor tem duração automática por causa da forma como foi criado. Por que não usa malloc? #include <stdlib.h> #include <stdio.h> int *make_array() { int *p = malloc(4 * sizeof *p); if (!p) { perror("malloc"); } *p = 5; p[1] = 2; p[2] = 999; p[3] = 90; return p; } int main(void) { int *a = make_array(); printf("%d %d %d %d", *a, a[1], a[2], a[3]); free(a); } Obs: aqui não retornamos o endereço do vetor, e sim o endereço do primeiro elemento do vetor.
  6. guidjos

    Função em C

    Qual a primeira coisa que vc não entende?
  7. guidjos

    Ponteiro

    A notação a[b] é equivalente a *(a + b). Curiosidade: como + é comutativo, *(a + b) é o mesmo que *(b + a), portanto seu código poderia dizer 4[p] e funcionar corretamente: http://codepad.org/bOEDViYa
  8. guidjos

    exercício de gabarito

    Como fez o resto do programa? Pra fazer o que a Isis sugeriu você só precisa usar o que (aparentemente) já sabe: condicionais e comparações (sugiro usar ">=").
  9. guidjos

    Árvore Binária de Busca

    Qual parte não entendeu?
  10. guidjos

    Placa

    Justamente: quando o mês for outubro, ultimonum é 0 e 10 % 10 é 0, portanto ultimonum == mes % 10 é verdadeiro. Esse teste funciona pra outubro, e coninua funcionando pra janeiro a setembro.
  11. guidjos

    Placa

    Olá e bem-vindo/a! Sobre o porquê de seu programa não acusar números inválidos: você não considera isso em seu fluxo. Sugiro sempre validar que placa E [0000; 9999]. Sobre seu fluxograma, não entendi o que é o estado em que você escreve "0". Ele me parece desnecessário. Além disso, você escreveu "ultimonum = mes / 1000". Claramente a lógica não é essa, como você disse em C. Além disso, uma forma de torná-lo mais simples é comparar ultimonum com mes % 10. Isso reduz o problema a uma condicional, ao invés das atuais duas (quando ultimonum != mes).
  12. guidjos

    Ordenar vetor de fila estática...

    Sugiro usar a função qsort. É a forma mais prática de alcançar seu objetivo (cumprir o requisito do trabalho e ganhar a nota). Mais educativo seria concluir que é melhor armazenar tudo já ordenado, fazendo com que as inserções respeitassem uma ordem total.
  13. guidjos

    Alocação Dinamica em funções

    Alguns conceitos básicos parecem estar confusos na sua cabeça. É normal, mas vamos corrigi-los: 1. Não existe passagem por referência em C. Argumentos são sempre passados por valor. Dizer f(&x) passa o valor do endereço do objeto x, e não uma referência a ele. Em um sistema com passagem por referência, a função (hipotética) f(x) { x = 10 } altera o valor de x no contexto em que a função é invocada. Isso nunca ocorre em C. Parece um detalhe minúsculo, mas se você aprofundar seus estudos em linguagens de programação, vai evitar problemas graves se já entender o conceito hoje. 2. Cuidado com os tipos que você está usando pra alocação. Se o tipo do parâmetro v é (int ***), como você disse ao declarar a função Ler_Imagem, você precisa armazenar dentro de v valores de tipo (int ***). Portanto a chamada de calloc está errada, pois explicita o tipo (int *) e determina o número de bytes como múltiplos de (int *). O mesmo vale para as iterações do seu for, onde você designa a *(v + i) (de tipo (int **)) valores com cast a (int *), e calculados como múltiplos de (int *). 3. calloc, malloc, etc, retornam valores de tipo (void *). A conversão de (void *) a (T *), sendo (T) um tipo de objeto (como, por exemplo, (int)), é natural e benigna. Portanto o melhor seria fazer int *p = malloc(3 * sizeof (int));. 4. sizeof é um operador, e não uma função. Em C, essa diferença é importante, porque nos deixa dizer coisas como sizeof *p ao invés de sizeof (int). A primeira forma é preferível por ser mais coesa (se resolvermos mudar o tipo de p mais tarde, o lado direito da expressão T *p = malloc(sizeof *p); não precisa ser corrigido). Se sizeof fosse uma função, sizeof *a causaria comportamento indefinido se o valor de a fosse indeterminado (como são os valores de p e v nestes exemplos). Dito isto tudo, e ignorando os erros de tipos e conselhos acima, ao dizer Ler_Imagem(..., &v);, o valor de v pode ser atualizado pela própria função Ler_Imagem. Portanto você já pode usar v sabendo que vai apontar para o primeiro elemento do primeiro vetor para dentro do qual v aponta. Geralmente, em C, temos 2 "correntes" relacionadas à forma como valores são passados entre funções: A primeira, que acho mais elegante, envolve funções que simplesmente retornam um valor como resultado: int **v = ler_imagem(); if (!v) { // Houve algum problema... } // Não houve problema, continuar normalmente e usar v. A segunda, que parece que te recomendaram, envolve passar um ponteiro como argumento, que apontará, depois que a função retornar, para o resultado da computação. Geralmente essa tática é preferida quando o valor de retorno da função não é o objetivo final pelo qual ela existe, e sim um indicador de status de execução: int v[x][y]; status_t s = ler_imagem(&v); switch (s) { // Avaliar todos os casos e definir qual foi o resultado da função. // Se for o caso, abortar o programa ou tratar o erro. } // Continuar normalmente e usar v. A forma que eu prefiro nem sempre é sustentável, porque geralmente transfere pelo menos parte da responsabilidade de tratamento de erros para dentro da função (ou, pior, alteração de estado de objetos externos de monitoramento de erro, que aumenta acoplamento). Mas procuro atingi-la sempre que possível. Pra mim parece mais simples. Abs
  14. guidjos

    De onde vem o valor de uma variável não setada, em C?

    É importante ressaltar que na maior parte dos casos, acessar o valor de um objeto sem antes inicializa-lo causa comportamento indefinido. Há casos em que há sim inicialização implícita (por exemplo, quando o objeto é declarado com storage duration static).
  15. guidjos

    Variável e Ponteiro ao criar um objeto.

    Preciso corrigir a resposta acima. Em primeiro lugar é preciso dizer que ambas as definições criam objetos. A diferença entre as duas é uma só: seus tipos. O tipo, no caso da primeira definição, é (Objeto). Na segunda, é (Objeto *). O segundo tipo se lê "ponteiro para (Objeto)". Ou seja, os valores com tipo (Objeto *) são ponteiros para objetos de tipo (Objeto). Dizemos, então, de forma vaga e informal, que a segunda definição designa um "ponteiro". É importante perceber que "ponteiro" não é um tipo de fato, e sim uma característica do tipo (podemos ter ponteiros para (int), ponteiros para (char), ponteiros para ponteiros para (int), ponteiros para vetores de (char), etc). Se restou qualquer dúvida, só dizer.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.