Ir para conteúdo
Fórum Script Brasil
  • 0

Retorno de uma Função é -1


fjralberto

Pergunta

Pessoal bom dia;

Ontem na faculdade aconteceu algo que muito provavelmente eu fiz e que o mestre ficou de cabelo em pé!

Ele pediu para criar um código de maneira que existam 2 funções sendo:

a primeira deve carregar valores numericos em um vetor;

e a segunda deve fazer a busca desse valor digitado, e caso ele não encontre nada deve ser retornado a -1 para que a mensagem "valor não encontrado" seja exibida.

Bom a questão é: na função que eu criei eu não estou retornando a valor algum, entretando acho que a função quando não especificado um valor de retorno, ela retorna a nada!

Mas está acontecendo algo impressionante do qual o mestre não conhecia e muito menos eu!

ele de alguma forma quando não encontra um valor, ele retorna a -1.

POR FAVOR ALGUÉM CONSEGUE ME EXPLICAR ISSO???????

Segue abaixo o código!

#include <stdio.h>

float vet[10], valor;
int i, verif;

void preenche(void);
int busca(float);

main()
{
      
      int pos;
      
      preenche();   
      
      do
      {
       //pos=99; -----esta linha eu comentei pois quiz forçar a variavel pos ter o numero 99 para ver se ela deixava de retornar a -1.
      printf("Digite 0 para sair ou digite o valor que voce deseja procurar:\n");
      scanf("%f",&valor);
          if(valor==0.0)
          {return 0;}
          pos=busca(valor);
          //printf("%i\n", pos);-----Essa linha eu comentei pois coloquei um printf para ter certeza do valor que ele estava retornando.
          if(pos==-1)
              {printf("O valor não foi encontrado.\n");}
      }while(1);
      
system("pause");
}    



//Funcao preenche
void preenche(void)
{
      for (i=0; i<10; i++)
      {
          printf("Digite o valor %i\n", i+1);
          scanf("%f",&vet[i]);
      }
}


//Funcao busca
int busca(float valor)
{
verif=0;
   for(i=0; i<10; i++)
   {
       if(vet[i]==valor)
       {
         verif=1;
             printf("O valor e: %f\n", vet[i]);
             printf("O valor está na posicao: %i\n", i);
       }
   }
 if(verif!=0)   
 return i;
}

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

resposta à 1ª pergunta: DevC++

resposta à 2ª pergunta: depois que você compilar o código, você roda ele e preenche 10 números com qualquer valor, pode também ser até em duplicidade, depois que você digitou os números que você quiz (10 ao todo), ele vai ter perguntar qual valor você deseja procurar, em seguida você digita qualquer valor que NÃO esteja na lista digitada por você. Aí ele vai lhe trazer a mensagem "O valor não foi encontrado", ou seja, ele estará retornando a -1.

Impressionante não!

Muito obrigado por estar tentando me ajudar para solucionar este caso.

Link para o comentário
Compartilhar em outros sites

  • 0

Compilei com o GCC e, logicamente, houve um Warning por não estar retornando um valor na função busca().

Executei o programa, mas se o valor não estiver no vetor, zero é retornado, não -1.

Estranho é que retorna 9 se eu colocar "verif" como variável local de busca()... :unsure:

Teste isto:

int retornar();

int main()
{
    int r = retornar();
    
    printf("r=%d\n", r);
    
    return 0;
}


int retornar()
{
    printf("oi\n");
}

QUal é a saída do programa?

Aqui deu r=3.

Estou achando que o -1 foi coincidência. Talvez era um lixo de memória.

Link para o comentário
Compartilhar em outros sites

  • 0

O meu retorno aqui tb foi 3.

Você tentou rodar o código que eu mandei no scopo do post?

No código que eu postei no início eu comentei 2 linha sa primeira

//pos=99;

e a segunda

//printf("%i\n", pos);

descomente a primeira linha que ele forçará "pos ter 99", onde logicamente a mensagem esperada ""O valor não foi encontrado.\n"" deveria não ser exibida, e descomente a segunda linha também que e e rode o código ele irá exibir o -1 como retorno para "pos".

Link para o comentário
Compartilhar em outros sites

  • 0
QUal é a saída do programa?

Aqui deu r=3.

Por algum motivo (não sei qual é) ele retorna sempre a quantidade de caracteres que a função printf escreveu !

Tente mudar a mensagem e veja o que acontece !

Edit:

Fiz algumas modificações no código e coloquei ele pra escrever várias mensagens !

Percebi que o retorno é sempre a soma da última mensagem...

Link para o comentário
Compartilhar em outros sites

  • 0

É de fato! Muito interessante, eu digitei um valor maior que "0i" outro valor e ele me retornou em "r" um valor maior também!

Eu poderia até viajar um pouco dizendo que:

O valor oi\n digitado anteriormente trouxe 3 como retorno em virtude de que no C todo final de qualquer valor digitado ele considera no espaço de memória uma marcação "0" como estes espaços em brancos são ocupados por zero, logo este é um caractere. Acredito que o "\n" está sendo considerado como 1, logo ((oi=2) +(\n=1) = 3), eu digitei "lalala\n" e ele retornou "r" como sendo 7.

e o caso do -1, seria porque não há nada retornando??????

Editado por fjralberto
Link para o comentário
Compartilhar em outros sites

  • 0
e o caso do -1, seria porque não há nada retornando??????
Acho que não...

se você não escrever nada na função e ele retorna "0"

Vou estudar um pouco mais o seu código e depois posto aqui...

Acredito que o "\n" está sendo considerado como 1, logo ((oi=2) +(\n=1) = 3), eu digitei "lalala\n" e ele retornou "r" como sendo 7.

Na verdade o "\n" representa, sim, um caractere !

O seu valor em ASCII é 10 !

Você deve estar confundindo com o que indica o final de uma string !

Link para o comentário
Compartilhar em outros sites

  • 0

Jonathan, de fato foi associando à string que eu como disse estaria "viajando", entretanto referente ao -1, eu concordo com você que ele deveria retornar a 0, mas o porque ele está retornando à -1, inclusive eu coloquei no uma linha //printf("%i\n", pos); no momendo que a variável "pos" recebe o retorno, do qual deveria ser 0, porém ele está exibindo na tela o próprio -1.

Sei que disse que iria estudar o código melhor, porém você tem um "cheiro" do que possa estar acontecendo?

Link para o comentário
Compartilhar em outros sites

  • 0

Esperimente mudar o codigo para: (estou sem compilador :P to tentando usa um mas não consigo :P)

#include <stdio.h>

float vet[10], valor;
int i, verif;

void preenche(void);
int busca(float);

main()
{

int pos;

preenche(); 

do
{
//pos=99; -----esta linha eu comentei pois quiz forçar a variavel pos ter o numero 99 para ver se ela deixava de retornar a -1.
printf("Digite 0 para sair ou digite o valor que voce deseja procurar:\n");
scanf("%f",&valor);
if(valor==0)
{return 0;}
pos=busca(valor);
//printf("%i\n", pos);-----Essa linha eu comentei pois coloquei um printf para ter certeza do valor que ele estava retornando.
if(pos==-1)
{printf("Erro \n");}
}while(1);

system("pause");
} 



//Funcao preenche
void preenche(void)
{
for (i=0; i<10; i++)
{
printf("Digite:%i\n", i+1);
scanf("%f",&vet[i]);
}
}


//Funcao busca
int busca(float valor)
{
verif=0;
for(i=0; i<10; i++)
{
if(vet[i]==valor)
{
verif=1;
printf("O valor é, possivelmente: %f\n", vet[i]);
printf("O varlor esta no vertor de numero: %i\n", i);
}
}
if(verif!=0) 
return i;
}

Fiz umas mudancinhas meio bobas, mas, pelo que eu vi no comentario la em cima, isso pode mudar um pouco as coisas....

Link para o comentário
Compartilhar em outros sites

  • 0

Eu rodei o código e não acho que não percebi nenhuma diferença exceto pelo printf erro que foi adicionado, mas de qualquer maneira este print está acontecendo porque o -1 está existindo... e a questão é justamente essa... porque o -1 está sendo retornado.

Abs,

Link para o comentário
Compartilhar em outros sites

  • 0

Isto é simples. Você simplesmente não está retornando nenhum valor quando verif == 0.

Neste caso, ele vai simplesmente retornar o que estiver no registrador eax.

Que, no caso de ser verif != 0, é a variável i.

Caso verif == 0, ele vai retornar o valor do ((endereço registrador ebx) - 4).

Entender o que realmente se passa precisa de um pouco de conhecimento de Assembly.

No exemplo do Beraldo, o registrador eax vai conter o valor que o printf retornou, logo também retornando o valor do printf.

PS: Inteiros com 1, 2 e 4 bytes são retornados pelo registrador eax.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Interessante, Durub.

O que achei estranho é que o valor retornado no meu exemplo mudava se eu colocasse verif como variável local.

Meu conhecimento de Assembly é baixo, ainda. Estudei para passar numa prova do primeiro semestre de 2008. Mas já fiquei com medo... hehehe

Este ano será imprescindível aprender bem. tenho uma disciplina de um semestre somente disso... que medo. :lol:

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...