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]

Responder a