• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bertolo

Como recebo vectores retornados de uma função

11 mensagens neste tópico

Desculpem lá o caps mas tenho teste AMNHÃ DE MANHÃ!!!!

Como recebo o vector f vindo da funçao???

#include <stdio.h>
char *Str(char s1[],char s2[]) {
int a,b,c;
char f[100];
for(a=0,b=0,c=0;s1[a]!='\0';a++)
{
if(s2[c]!='\0'){
if(s1[a]!=s2[c]){
f[b]=s1[a];b++;c=0;}
else
c++;
}}
return f;
}

main(){
char s1[100], s2[100];
char s3[100];int a;
for(a=0;s3[a]!='\0';a++){
s3[a]=0;}
printf("STRING s1:");
gets(s1);
printf("STRING s2:");
gets(s2);
s3=Str(s1,s2);
printf("STRING FINAL:%s\n",s3);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

btw era suposto eu tirar a primeira ocorrencia da string s2 na string s1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

char* xxx=Str(...)

é claro que isto de pouco serve, pois xxx vai ficar a apontar para uma posição de memória local à função Str e como tal poderá se traduzir em erros.

deves passar o array do resultado como argumento da função.

char *Str(char s1[],char s2[],char f[]) {
int a,b,c;
for(a=0,b=0,c=0;s1[a]!='\0';a++)
{
if(s2[c]!='\0'){
if(s1[a]!=s2[c]){
f[b]=s1[a];b++;c=0;}
else
c++;
}}
return f;
}

...
Str(s1,s2,s3);
...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao percebi rui podes explicar com este programa q e mais facil

#include <stdio.h>

char func(char *a){
a[0]='b';

a[1]='b';

a[2]='b';

return  a;

}


main(){

char a[2]={'a','a','a'};

func( a);

printf("%s\n",a);}

pq e que isto imprime merdas depois.acho q se me explicares isto eu fico a perceber o que me falta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nesse a função func devia ser void.

tu já está a alterar um array que recebeste como argumento.

o que não podes fazer é devolver um array que tenha sido declarado dentro de uma função.

isto está errado:

char* func(){
char a[3];
a[0]='b';
a[1]='b';
a[3]='b';
return a;
}

isto está certo:

void func(char* a) // ou: void func(char a[])
{
a[0]='b';
a[1]='b';
a[3]='b';
return a;
}

isto está certo:

char* func(){
char* a=malloc(3*sizeof(char));
a[0]='b';
a[1]='b';
a[3]='b';
return a;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

juro q nao to a gozar, achei mt comico a soluçao q mais me agradou foi akela q disseste q tava errada ;).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

as 3 soluçoes que deste da funçao...quer sejam certas ou erradas deram todas um output ainda mais feio q o meu.... ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que não podes fazer é devolver um array que tenha sido declarado dentro de uma função.

Pode, desde que copie o conteúdo do apontador logo a seguir à chamada à função, de forma a obter o que estava no "stack da função" antes que este seja reescrito. Pode não ser a solução mais elegante (e das que apontaste, uma é mais elegante (a de passar o apontador como parâmetro) e outra não (a de fazer malloc dentro da função, porque depois há que fazer free e pode tornar-se feio) ), mas isto é correcto:

#include <stdio.h>

char *func() {
char ret[4];
ret[0]='O';
ret[1]='l';
ret[2]='a';
ret[3]=0;
return ret;
}

void main() {
char *cp;
char ca[4];
int i;
cp=func();
for (i=0; i<4; ++i)
	ca[i]=cp[i];

printf("%s\n", ca);
}

Como disse, não é nada elegante, mas funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Retornar o ponteiro da stack é o que se chama de programação de m***da. Desculpa lá o termo.

Por duas razões.

1. Funciona, ou não. Não é certo nem garantido, já que está fora das regras. E se não é garantido na linguagem, pode não funcionar em todas as arquitecturas.

2. O retorno de um ponteiro não é apenas um valor. Tem um significado de responsabilidade, no que toca a gerir memória.

O que se está a fazer ao passar um ponteiro é: uma referência para uma posição de memória + uma responsabilidade de gestão dessa memória. Ou seja, é suposto o programador libertar a memória desse ponteiro. E se isso for executado neste caso rebenta.

  É certo que o programador sabe o que está á espera porque foi ele que construiu a função. Mas é com estas más práticas de programação que aparecem os bugs.

  Se o ponteiro não é suposto trazer consigo a responsabilidade de gestão de memória, então devia ser uma referência.

Conclusão, só serão consideradas válidas duas opções. Ou se retorna um ponteiro (correctamente) da função, ou se passa uma referência para a função (sem transmitir responsabilidade para a função.)

  As formas correctas que o Carlos falou.

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora