On Fri, 28 Dec 2001 21:03:40 -0200
[EMAIL PROTECTED] wrote:
> Ola,
>
Oi.
> Eu estou fazendo o Curso de C da UFMG, e mandei algumas duvidas pra eles
> e nao obtive resposta!:)
>
> Tive algumas duvidas que nao achei resposta, se vcs puderem me ajudar! :)
>
> O compilador que eu uso eh o gcc do linux vers�o: 2.95!
>
> Eu fiz uma fun��o clone da strlen() chamada StrLen() como recomendado de
> exercicio. Eu fiz da
> seguinte forma:
>
> #include <stdio.h>
>
> int main( int x, int recebe ){
>
> char str1[100]="\0";
>
> x=0;
>
> printf("\n\nDigite uma String: ");
> scanf("%s",&str1);
> recebe=StrLen(x,str1);
> printf("\n\nA str1 contem %d caracteres!\n\n",recebe);
>
> return(0);
> }
>
> int StrLen ( int y, char *conta_string ){
>
> for (; *conta_string != 0; conta_string++ ){
>
> y++;
>
> }
>
> return(y);
> }
>
Bom. Nao esta errado, mas seria mais simples, para quem
for usar a tua funcao, se ela fosse assim:
int StrLen ( char *conta_string )
{
int y;
for (; *conta_string != 0; conta_string++ ){
y++;
}
return(y);
}
Dessa forma, a variavel necessaria para contar os
caracteres esta declarada como local na funcao...
>
> O programa funciona perfeitamente aqui! :)
>
> Eu nele mesmo eu tenho algumas duvidas, se vcs puderem me esclarecer! :)
>
> 1) Suponha que eu quisesse que a fun��o StrLen retornasse um ponteiro de
> caracteres ao inves de um inteiro como ela esta retornando. Como eu declaro
> uma
> fun��o para retornar um ponteiro ??
>
> Seria: char *StrLen ( int y, char *conta_string ) {
> } ?? Esta correto ?? Funcionaria ??
>
>
A declaracao esta correta, mas nao sei qual a finalidade que tu queria
para esta funcao...
> 2) Eu tentei na fun��o StrLen usar um ponteiro para "anexar" o endere�o
> de x e altera-lo
> diretamente ao inves de usar o return(y); porem nao consegui! Eu fiz
> da seguine forma:
>
>
> #include <stdio.h>
>
> int main( int x, int recebe ){
>
> char str1[100]="\0";
>
> x=0;
>
> printf("\n\nDigite uma String: ");
> scanf("%s",&str1);
> recebe=StrLen(x,str1);
Acho que so faltou tu colocar um & na frente do x para
indicar que tu quer passar "o endereco" de x (passagem
por referencia) e nao passagem por valor...
recebe=StrLen(&x,str1);
Claro, como eu comentei antes, para fim "educacionais" tua
funcao esta ok, mas para fins praticos, ainda seria melhor
usar algo como eu lhe mostrei antes...
> printf("\n\nA str1 contem %d caracteres!\n\n",recebe);
>
> return(0);
> }
>
> int StrLen ( int *y, char *conta_string ){
>
> for (; *conta_string != 0; conta_string++ ){
>
> *y++;
Talvez tu tenha que colocar entre (), por causa da
precedencia dos operadores. Mesmo que nao precise,
seria melhor voce acostumar a sempre colocar os ()
porque, para quem esta "lendo" o seu programa, eh
mais facil entender...
(*y)++;
>
> }
>
> }
>
>
> Mas tmb nao funcionou! Eu tmb tentei fazer a StrLen da seguinte forma:
>
>
> int StrLen ( int y, char *conta_string ){
>
> int *p;
> p=&y;
>
> for (; *conta_string != 0; conta_string++ ){
>
> *p++;
>
> }
>
> }
>
>
> Mas tmb nao funcionou! Ele nao alterava o valor da variavel "x" anexada
> indiretamente
> ao ponteiro de jeito nenhum! :/
>
> O que eu estou fazendo errado ? Como seria o certo ?
Certamente o mesmo problema de antes. Quando voce esta
chamando a funcao voce deveria colocar o & antes da variavel...
>
>
> 3) No seguinte programa:
>
> #include <stdio.h>
>
> int main(){
>
> float x=3.75, *p, **pointer;
>
> p=&x;
> pointer=&p;
>
> printf("\n%f\n",**pointer);
> printf("\n%f\n",*p);
> //printf("Pointer %p p %p x %p",pointer,&pointer,&p);
> //printf("Pointer %p p %p",p,&x);
> printf("\n");
>
>
> return(0);
> }
>
>
> O *p eh o conteudo armazenado em x, certo ?
> E &p eh o endere�o da memoria do ponteiro p ?? Esta certo ?
> E o p eh o endere�o de memoria da variavel x ? Esta certo ?
> E &pointer eh o endere�o de momoria do ponteiro pointer? certo ?
> E finalmente pointer eh o endere�o de memoria do ponteiro p ? correto ?
>
> Minha duvida eh no &p e p e pointer e &pointer. hehehe :)
>
>
> 4) Essa eh minha ultima pergunta. Como eu crio uma biblioteca .h (header)
> ?
> Por exemplo suponha que esse pequeno programa que eu fiz como "clone"
> do StrLen eu quisesse
> transformar em um header, como eu faria ??
>
> Como eu o chamaria na include do meu programa a usar essa StrLen ? seria:
> #include "StrLen.h" ??
>
> Se vc pudesse me dar um exemplo de como fazer isso com esse programa
> eu ficaria muito grato.
Esta correto.
Exemplo de header.
#ifndef ALGUM_NOME
#define ALGUM_NOME
int StrLen( int y, char *conta_string );
#endif
Seria isso.
Esses #ifndef (se nao definido), #define (defina) e
#endif (fim do se) seria para, quando o compilador
estiver compilando seus programas, ele compilar apenas
uma vez cada header que tu tens.
Substitua o ALGUM_NOME por algum nome adequado, que nao
conflite com outro que tu tenhas ou de alguma biblioteca
que voce utilizar.
Eu, por exemplo, uso minhas iniciais + um nome.
Por exemplo, um arquivo com minhas rotinas ficaria assim:
#ifndef ASG_TOOLS_H
#define ASG_TOOLS_H
void itobool( int value, char* result );
void rotina2( );
int rotina3( int x );
#endif
>
>
> Obrigado pela ajuda e pelo bom curso que vcs escreveram. =]
>
> [ ]'s
>
>
Dentro do possivel, sempre nos ajudamos.... Como dizem,
uma mao lava a outra, e as duas lavam o rosto...
[]s
------------------------------------------------------------
Alex Sandro Garz�o [mailto:[EMAIL PROTECTED]]
_ Software Engineer
�v� T&T Engenheiros Associados Ltda
/(_)\ www.tteng.com.br
^ ^ Linux user #229193
Computer Science student
------------------------------------------------------------
Assinantes em 02/01/2002: 2270
Mensagens recebidas desde 07/01/1999: 148472
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
mailto:[EMAIL PROTECTED]