[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Programação em c.



 Erro clássico. Normalmente por quem veio de outras linguagens.

 Em C o compilador não aloca *nada* pra vc. Vc tem que alocar *tudo*.

 Vamos ver o código com erro:

1    float pi=3.1415;
2    char *escreve;
3    sprint(escreve,"pi = %f",pi);

 Na linha 1 vc aloca uma variável do tipo float e já atribui um valor.
 Na linha 2 vc aloca um _ponteiro_ para um char
 Na linha 3 vc converte um float em uma notacao legível e coloca no
conteúdo de memória apontado pelo ponteiro.

 Se vc prestar atenção vai perceber que vc não apontou o ponteiro para
lugar algum. Portanto ele pode estar apontando para qq lugar na
memória. Nesse caso é simplesmente impossĩvel prever oq vai acontecer
(em raríssimas condições pode acontecer de funcionar).

 Solução:
 Existem duas soluções. Ambas passam por um processo de alocar memória
para armazenar o texto convertido.
 Solução #1 (mais simples) - alocar um array ao invés de um ponteiro

1    float pi = 3.1415;
2    char escreve[10];
3    sprintf(escreve, "%f", pi);

 Note que na linha 2 vc está alocando 10 caracteres, e que na linha 2
vc passa o array sem índice, que é equivalente a um ponteiro.

 Solução #2 (mais complexa e desnecessária) - alocar um ponteiro e
alocar memória manualmente

1    float pi = 3.1415;
2    char *escreve;
3    escreve = malloc(10 * sizeof(char));
4    sprintf(escreve, "%f", pi);
5    free(escreve);

 Nesta solução vc continua alocando um ponteiro para caracter, mas
logo abaixo explicitamente aloca 10 caracteres em memória. Assim vc
tem memória alocada e o ponteiro aponta uma posição de memória alocada
para uso do programa.
 Note que depois do comando free vc não pode mais usar o ponteiro
escreve como um ponteiro para uma área de memória alocada, e portanto,
dependendo da operação, pode causar outro seg-fault.

 Acho que isso esclarece um pouco.

 Fabio.

 P.S.: Sim, eu gostaria muito de dar aulas de C/C++, e estou no Vale do Paraíba.





On 4/7/06, Alexandre Brito <ale532002@yahoo.com.br> wrote:
>
> O difícil é dizer onde não funciona.
>
>
> --- Fernando Morgenstern <stormrider.may@gmail.com>
> escreveu:
>
> > Me desculpem a pergunta idiota, mas C funciona em
> > windows e linux? Ou só linux?
> >
> > Em 07/04/06, elementar<elementar@gmail.com>
> > escreveu:
> > > se você quer aprender a sintaxe, é bom pegar o
> > começo.
> > >
> > >  http://www.inf.ufrgs.br/~nmaillard/info1040/c.pdf
> > >
> > >  esse da unicamp é bem legal!!!
> > >
> > >
> > > On 4/7/06, elementar <elementar@gmail.com> wrote:
> > > >
> > > > agora está dando falha de segmentação, mas o
> > codigo é assim mesmo???
> > > >
> > > > float pi=3.1415;
> > > > char *escreve;
> > > >
> > > > sprint(escreve,"pi = %f",pi);
> > > >
> > > > estou errando nada ou estou???
> > > >
> > > >
> > > >
> > > > On 4/7/06, elementar < elementar@gmail.com>
> > wrote:
> > > > >
> > > > > obrigado, vou testar o sprintf.
> > > > >
> > > > >
> > > > >
> > > > > On 4/6/06, Jakson A. Aquino
> > <jaksonaquino@gmail.com> wrote:
> > > > > > On Thu, Apr 06, 2006 at 07:23:27PM -0300,
> > elementar wrote:
> > > > > > > Olá,
> > > > > > >
> > > > > > > Alguem sabe uma função inversa a "atof",
> > que é de string para float,
> > > uma de
> > > > > > > float para string.???
> > > > > >
> > > > > >   sprintf(s, "%f", f);
> > > > > >
> > > > > > Digite no terminal:
> > > > > >
> > > > > >   man sprintf
> > > > > >
> > > > > > --
> > > > > > Jakson A. Aquino
> > > > > > http://distante.dyndns.org:8280/
> > > > > >
> > > > > >
> > > > > > --
> > > > > > To UNSUBSCRIBE, email to
> > > debian-user-portuguese-REQUEST@lists.debian.org
> > > > > > with a subject of "unsubscribe". Trouble?
> > Contact
> > > listmaster@lists.debian.org
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
> > --
> > Fernando Marcelo Morgenstern
> >
> > Programador Web
> >
> >
>
>
> --
> Alexandre R. Brito
> Linux user #279787 [http://counter.li.org/]
> ale53@hotpop.com
> skype - ale532002
>
>
>
> _______________________________________________________
> Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz.
> http://br.info.mail.yahoo.com/
>
>
> --
> To UNSUBSCRIBE, email to debian-user-portuguese-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
>
>


--
Não existem Killer Applications de Código Aberto em Java.
Ajude a provar o contrário:
http://drupal.gulivap.org/?q=node/106

Reply to: