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: