Ir ao conteúdo
  • Cadastre-se

Sobre erros


Cambalinho

Posts recomendados

-nao podemos usar 1 funçao dentro da condiçao de 1 'for'?

for (i=0; i<=strlen(charnome);i++)

se o fizer recebo 1 aviso, mas o programa funciona normalmente:

'warning C4018: '<=' : signed/unsigned mismatch'

PS:strlen() da-nos o comprimento da string(sem o caracter '\0'... é o dilimitador da string).

- o que quer dizer: "warning C4172: returning address of local variable or temporary"?

eu no 'return' uso 1 variavel char com vetor:

char *LowCase(char *origem)
{
char c[255];
int i;
int size;
size=strlen(origem); //eu tentei meter a funçao strlen() no 'for', mas da-me 1 aviso
for (i=0; i<=size; i++)
{
c[i]=tolower(origem[i]) ;
}
return c;
}

Link para o comentário
Compartilhar em outros sites

Na linguagem C, todas as variaveis criadas dentro de um metodo são destruidas(liberadas para serem usadas de novo) então você está retornando um endereço de memoria que vai ser destruido.

char *LowCase(char *origem, char *destino)
{
int i;
int size;
size=strlen(origem); //eu tentei meter a funçao strlen() no 'for', mas da-me 1 aviso
for (i=0; i<=size; i++)
{
destino[i]=tolower(origem[i]) ;
}
return destino;
}

int main()
{
char *OI = "HELLO";
char oi[255];
oi = LowCase(OI, oi);

return 0;
}

Link para o comentário
Compartilhar em outros sites

Na linguagem C, todas as variaveis criadas dentro de um metodo são destruidas(liberadas para serem usadas de novo) então você está retornando um endereço de memoria que vai ser destruido.

char *LowCase(char *origem, char *destino)
{
int i;
int size;
size=strlen(origem); //eu tentei meter a funçao strlen() no 'for', mas da-me 1 aviso
for (i=0; i<=size; i++)
{
destino[i]=tolower(origem[i]) ;
}
return destino;
}

int main()
{
char *OI = "HELLO";
char oi[255];
oi = LowCase(OI, oi);

return 0;
}

ou seja mesmo que só preciso do retorno, tenho de usar 1 segundo argumento para retornar o resultado, certo?

Link para o comentário
Compartilhar em outros sites

Não exatamente. Na linguagem C existe a função malloc e free, malloc cria o espaço na memoria, e free libera a memoria.

Você poderia fazer

char *LowCase(char *origem)
{
int i;
int size;
char *destino = (char*)malloc( 255 * sizeof(char) );
size=strlen(origem); //eu tentei meter a funçao strlen() no 'for', mas da-me 1 aviso
for (i=0; i<=size; i++)
{
destino[i]=tolower(origem[i]) ;
}
return destino;
}

int main()
{
char *OI = "HELLO";
char *oi
oi = LowCase(OI);

// demais codigos;

free(oi); // liberar memoria
return 0;
}

o codigo acima NÃO DEVE SER FEITO, por alguns motivos.

1- Você precisa lembrar de liberar a memoria depois. Depois de varias chamadas do metodo a memoria do computador pode esgotar.

2- Você pode perder o ponteiro onde a memoria foi alocada, e não poderá liberar a memoria(memoria só vai ser liberada quando encerrar o applicativo)

3- Veja que as funções padrões da linguagem NÃO utiliza esses metodos (sprintf, strcpy, itoa...)

outra coisa, esse tipo de retorno poder ser feito com variaveis primitivas normalmente, exemplo:

int GetValue()
{
int resultado;
...
return resultado;
}

Link para o comentário
Compartilhar em outros sites

Não exatamente. Na linguagem C existe a função malloc e free, malloc cria o espaço na memoria, e free libera a memoria.

Você poderia fazer

char *LowCase(char *origem)
{
int i;
int size;
char *destino = (char*)malloc( 255 * sizeof(char) );
size=strlen(origem); //eu tentei meter a funçao strlen() no 'for', mas da-me 1 aviso
for (i=0; i<=size; i++)
{
destino[i]=tolower(origem[i]) ;
}
return destino;
}

int main()
{
char *OI = "HELLO";
char *oi
oi = LowCase(OI);

// demais codigos;

free(oi); // liberar memoria
return 0;
}

o codigo acima NÃO DEVE SER FEITO, por alguns motivos.

1- Você precisa lembrar de liberar a memoria depois. Depois de varias chamadas do metodo a memoria do computador pode esgotar.

2- Você pode perder o ponteiro onde a memoria foi alocada, e não poderá liberar a memoria(memoria só vai ser liberada quando encerrar o applicativo)

3- Veja que as funções padrões da linguagem NÃO utiliza esses metodos (sprintf, strcpy, itoa...)

outra coisa, esse tipo de retorno poder ser feito com variaveis primitivas normalmente, exemplo:

int GetValue()
{
int resultado;
...
return resultado;
}

sim para numeros.

mas nao posso fazer(sem warnings):

char *copystring(char *origem)
{
char *a;
//algum codigo
return a; //sabendo que a é o que esta no origem
}

?????

Link para o comentário
Compartilhar em outros sites

sim para numeros.

mas nao posso fazer(sem warnings):

char *copystring(char *origem)
{
char *a;
//algum codigo
return a; //sabendo que a é o que esta no origem
}

?????

char *copystring(char *origem)
{
size_t len = strlen(origem);
char *a = (char*)malloc(len * sizeof(char));

do
a[len] = origem[len];
while (len--);

return a;
}

char *copystring(char *src, char *dest)
{
int i;
size_t len = strlen(src);
for (i = 0; i <= len; i++)
dest[i] = src[i];

return dest;
}

a primeira é o metodo certo, a segunda é errado.

ja existe essa função implementada em string.h chamada strcpy

Link para o comentário
Compartilhar em outros sites

char *copystring(char *origem)
{
size_t len = strlen(origem);
char *a = (char*)malloc(len * sizeof(char));

do
a[len] = origem[len];
while (len--);

return a;
}

char *copystring(char *src, char *dest)
{
int i;
size_t len = strlen(src);
for (i = 0; i <= len; i++)
dest[i] = src[i];

return dest;
}

a primeira é o metodo certo, a segunda é errado.

ja existe essa função implementada em string.h chamada strcpy

eu usei essa funçao como exemplo;)

obrigado pela ajuda amigo.

olha podes me explicar o outro erro? ou isso é logico?(1 condiçao, nao deve ler 1 funçao á mistura?)

Link para o comentário
Compartilhar em outros sites

for (i=0; i<=strlen(charnome);i++)

se o fizer recebo 1 aviso, mas o programa funciona normalmente:

'warning C4018: '<=' : signed/unsigned mismatch'

sabes se é por a funçao estar na condiçao do 'for'?

não sei, você esta usando um compilador antigo, no Visual Studio 2012 não da problema, mas deve ser porque strlen retorna um size_t e a variavel i é do tipo int. Tente iniciar i com size_t

mesmo se não for esse o erro veja como o for funciona:

for (iniciaVariavel, condicao, atualizacao)
{
//codigo
}

ele inicia a variavel.

testa a condição, nessa hora ele chama a função strlen e descobre o valor.

passa pelo codigo

atualização

testa a condição e novamente chama a função strlen que você já calculou antes, e calculará de novo.

No caso acima seria melhor ter guardado o valor do strlen em uma variavel esterna.

for (size_t i = 0, len = strlen(str); i <= len; i++) ...
Link para o comentário
Compartilhar em outros sites

não sei, você esta usando um compilador antigo, no Visual Studio 2012 não da problema, mas deve ser porque strlen retorna um size_t e a variavel i é do tipo int. Tente iniciar i com size_t

mesmo se não for esse o erro veja como o for funciona:

for (iniciaVariavel, condicao, atualizacao)
{
//codigo
}

ele inicia a variavel.

testa a condição, nessa hora ele chama a função strlen e descobre o valor.

passa pelo codigo

atualização

testa a condição e novamente chama a função strlen que você já calculou antes, e calculará de novo.

No caso acima seria melhor ter guardado o valor do strlen em uma variavel esterna.

muito obrigado por tudo

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!