Dúvida questão 10 Lista 3

3 views
Skip to first unread message

FelipePA

unread,
Dec 15, 2010, 2:52:57 PM12/15/10
to Comp-Prog
Opa, espero que seja simples a minha dúvida.
Não entendi uma parte da resposta dessa questão:

Quando eu estava fazendo, escrevi a função " f " como se fosse void,
mas no gabarito está do tipo int. Porém quando ela é chamada na main
não tem uma variável para receber o retorno da função. Daí eu fiquei
confuso. >.<

Se alguém puder me esclarecer aí, ficarei grato.

Douglas Coutinho

unread,
Dec 15, 2010, 2:57:09 PM12/15/10
to comp...@googlegroups.com
qual prova? qual questão?

Douglas Coutinho

unread,
Dec 15, 2010, 2:57:44 PM12/15/10
to comp...@googlegroups.com
deixa pra lá

Fernando Silva

unread,
Dec 15, 2010, 3:02:11 PM12/15/10
to comp...@googlegroups.com
Felipe,

No caso a função f retorna um valor em EAX, que nesse caso é um inteiro, então f teria que ser do tipo inteiro.

Mas, no caso, o que f retorna realmente não está sendo aproveitado pela main, então é perfeitamente lógico o seu pensamento, mas como a questão pede para você escrever o código C referente ao código dado, e nele há um retorno da função f, o correto mesmo seria colocar ela como do tipo int.

FelipePA

unread,
Dec 15, 2010, 3:08:25 PM12/15/10
to Comp-Prog
Tá, pera aí. Agora eu fiquei ainda mais confuso, hehehh >.<

Então " f " tem mesmo que ser do tipo inteiro porque retorna algo em
EAX, mesmo que não seja usado? Mas poxa, daí " g " não tinha que ser
do tipo inteiro também, pelo mesmo motivo? E se for inteiro mesmo e a
main chama " f " sem ter alguém pra receber o retorno, não iria dar
erro na hora de compilar?



On Dec 15, 6:02 pm, Fernando Silva <fms2...@gmail.com> wrote:
> Felipe,
>
> No caso a função f retorna um valor em EAX, que nesse caso é um inteiro,
> então f teria que ser do tipo inteiro.
>
> Mas, no caso, o que f retorna realmente não está sendo aproveitado pela
> main, então é perfeitamente lógico o seu pensamento, mas como a questão pede
> para você escrever o código C referente ao código dado, e nele há um retorno
> da função f, o correto mesmo seria colocar ela como do tipo int.
>
> Em 15 de dezembro de 2010 17:57, Douglas Coutinho
> <barabas...@gmail.com>escreveu:
>
>
>
>
>
>
>
> > deixa pra lá
>
> > Em 15 de dezembro de 2010 17:57, Douglas Coutinho <barabas...@gmail.com>escreveu:
>
> > qual prova? qual questão?
>

Fernando Silva

unread,
Dec 15, 2010, 3:13:45 PM12/15/10
to comp...@googlegroups.com
Felipe,

Se você olhar o código da função g com calma, vai ver que ela não tem retorno nenhum. E no caso, e isso é a forma com que o C opera, quando uma função retorna um valor, e não tem aonde armazenar, ele simplemente é descartado, por exemplo, o scanf retorna um valor, mas 90% das vezes, o programa que foi feito simplesmente descarta esse valor.

FelipePA

unread,
Dec 15, 2010, 3:25:40 PM12/15/10
to Comp-Prog
É, imaginei que minha dúvida fosse ser mais em C mesmo. Enfim. ¬¬

Mas cara, desculpa perturbar mas eu ainda não entendi porque " f " não
pode ser Void. O que eu tinha que ter prestado atenção pra notar isso?
Porque o que eu faço normalmente é olhar o código da subrotina que
chamou ela e vejo se ela usou o valor de retorno. Se não usou, então
já penso que é void. É muito errado pensar assim?

Valeu pela atenção aí. : )

On Dec 15, 6:13 pm, Fernando Silva <fms2...@gmail.com> wrote:
> Felipe,
>
> Se você olhar o código da função g com calma, vai ver que ela não tem
> retorno nenhum. E no caso, e isso é a forma com que o C opera, quando uma
> função retorna um valor, e não tem aonde armazenar, ele simplemente é
> descartado, por exemplo, o scanf retorna um valor, mas 90% das vezes, o
> programa que foi feito simplesmente descarta esse valor.
>

Fernando Silva

unread,
Dec 15, 2010, 3:34:07 PM12/15/10
to comp...@googlegroups.com
Bem, se ela for do tipo Void, não dá erro na compilação(to levando em consideração o gcc, não sei como outros compiladores se comportariam), mas vai gerar um warning dizendo que void tentou retornar um valor inteiro, então ao meu ver, em primeira instância, estar void não estaria errado, eu diria que estaria errado você esquecer de colocar o return ao final da função C, porque esse sim está explicito no código, mas acontece que, se eu estou retornando um valor, o correto é que minha função seja declarada tendo o tipo desse valor que está sendo retornado, logo que ela seja int.

A conclusão que eu quero chegar é que, inicialmente, declarar a função como void não é um erro, mas ao perceber que existe um return que, ao meu ver, se for omitido é um erro, tomar o cuidado de declarar a função como int se torna o mais correto, então eu diria que, a nível de prova, você poderia ter uns décimos descontados por declarar a função como void, mas que não seria nada grave.

FelipePA

unread,
Dec 15, 2010, 3:45:35 PM12/15/10
to Comp-Prog
Sim, entendi o que você quis dizer, tem razão mesmo.
É que eu não estou conseguindo ver onde no código que está mostrando
que retorna algo. Assim, acho que o meu grande problema tá sendo ver a
diferença entre " f " e " g " pra dizer que uma é Int e a outra Void.
Pra mim se comportam da mesma maneira: terminam com algum valor
retornando em EAX, mas esse valor é jogador ignorado.

On Dec 15, 6:34 pm, Fernando Silva <fms2...@gmail.com> wrote:
> Bem, se ela for do tipo Void, não dá erro na compilação(to levando em
> consideração o gcc, não sei como outros compiladores se comportariam), mas
> vai gerar um warning dizendo que void tentou retornar um valor inteiro,
> então ao meu ver, em primeira instância, estar void não estaria errado, eu
> diria que estaria errado você esquecer de colocar o return ao final da
> função C, porque esse sim está explicito no código, mas acontece que, se eu
> estou retornando um valor, o correto é que minha função seja declarada tendo
> o tipo desse valor que está sendo retornado, logo que ela seja int.
>
> A conclusão que eu quero chegar é que, inicialmente, declarar a função como
> void não é um erro, mas ao perceber que existe um return que, ao meu ver, se
> for omitido é um erro, tomar o cuidado de declarar a função como int se
> torna o mais correto, então eu diria que, a nível de prova, você poderia ter
> uns décimos descontados por declarar a função como void, mas que não seria
> nada grave.
>

Fernando Silva

unread,
Dec 15, 2010, 3:54:50 PM12/15/10
to comp...@googlegroups.com
Felipe,

É relativamente fácil de identificar se uma função retorna algo, ou não, e no caso, se não há retorno, a função é do tipo void.

A função g não retorna nada, enquanto a f retorna, apesar de seu retorno ser descartado na main.

Uma coisa que você pode sempre observar é que, não há sentido ter mais linhas de código depois do return em um código C, e que o retorno é explicito, quando a ultima linha da função, antes do leave, trata de mover um valor para EAX, como é o caso da f.

Então, quando você analisar um código assembly para "traduzir" para C, repare se a ultima coisa que foi feita foi colocar/mudar um valor em EAX, isso é o que define um return, e como eu disse anteriormente, se tem um return, o tipo da função não será void, e caso não tenha, será void.

Espero que isso te dê uma luz maior na hora de identificar esses detalhes.

FelipePA

unread,
Dec 15, 2010, 4:05:52 PM12/15/10
to Comp-Prog
Ahhh cara, acho que agora eu entendi! : )
Realmente, não fez sentido ele voltar aquele valor pra EAX antes do
leave. Nem tinha reparado isso.

Brigadão, Fernando!

On Dec 15, 6:54 pm, Fernando Silva <fms2...@gmail.com> wrote:
> Felipe,
>
> É relativamente fácil de identificar se uma função retorna algo, ou não, e
> no caso, se não há retorno, a função é do tipo void.
>
> A função g não retorna nada, enquanto a f retorna, apesar de seu retorno ser
> descartado na main.
>
> Uma coisa que você pode sempre observar é que, não há sentido ter mais
> linhas de código depois do return em um código C, e que o retorno é
> explicito, quando a ultima linha da função, antes do leave, trata de mover
> um valor para EAX, como é o caso da f.
>
> Então, quando você analisar um código assembly para "traduzir" para C,
> repare se a ultima coisa que foi feita foi colocar/mudar um valor em EAX,
> isso é o que define um return, e como eu disse anteriormente, se tem um
> return, o tipo da função não será void, e caso não tenha, será void.
>
> Espero que isso te dê uma luz maior na hora de identificar esses detalhes.
>
Reply all
Reply to author
Forward
0 new messages