Discussion:
Ayuda con programa
(demasiado antiguo para responder)
Kenzo-Xs
2003-09-10 18:40:54 UTC
Permalink
En esta funcion de C:

void divide (int a, int b) {
float c;
c = (float) a / b;
return c;
}

¿¿¿¿¿¿No se contradice el void divide con el return??????
Julián Albo
2003-09-10 19:02:19 UTC
Permalink
Es de pésimo gusto copiar el mismo mensaje en varios grupos. Las pocas
veces que es adecuado hacerlo hay que usar un cross-post.

Salu2
Kenzo-Xs
2003-09-10 23:33:29 UTC
Permalink
Lo sineto , solo lo he hecho en c y en c++ , creo que se pueden relacionar
con lo que pregunto , respecto a lo del cross-post , no se lo que es ni como
se hace pero pido disculpas si he molestado a alguien
Es de pésimo gusto copiar el mismo mensaje en varios grupos. Las pocas
veces que es adecuado hacerlo hay que usar un cross-post.

Salu2
ViKT0RY
2003-09-10 22:55:55 UTC
Permalink
En respuesta a:
"Kenzo-Xs" <***@hotmail.com> news:bjnr7j$l8g7m$***@ID-204477.news.uni-berlin.de

Mensaje:

Realmente no se contradice, toda funcion devuelve siempre algo, el void mas
que nada es para el compilador, para que tenga en cuenta que en principio no
se espera ningun valor devuelto (por algo se llama *declaración* de una
funcion). Aun así supongo que podrías poner j=divide(2,1); siempre que el
compilador no te dé un error por la declaración (tampoco creo que cueste
mucho poner float divide :)
Kenzo-Xs
2003-09-10 23:35:28 UTC
Permalink
Me ha dicho Julian Albo en otro post , que si que se contradice
La cuestion es que es una pregunta de examen , y dice si es correcta o no
esta funcion y yo creo que esta ahi el fallo

Muchas gracias por tu respuesta y saludos
Post by ViKT0RY
Realmente no se contradice, toda funcion devuelve siempre algo, el void mas
que nada es para el compilador, para que tenga en cuenta que en principio no
se espera ningun valor devuelto (por algo se llama *declaración* de una
funcion). Aun así supongo que podrías poner j=divide(2,1); siempre que el
compilador no te dé un error por la declaración (tampoco creo que cueste
mucho poner float divide :)
Martin J. Sanchez
2003-09-11 00:11:00 UTC
Permalink
On Thu, 11 Sep 2003 00:55:55 +0200, "ViKT0RY"
Post by ViKT0RY
Realmente no se contradice, toda funcion devuelve siempre algo, el void mas
que nada es para el compilador, para que tenga en cuenta que en principio no
se espera ningun valor devuelto (por algo se llama *declaración* de una
funcion). Aun así supongo que podrías poner j=divide(2,1); siempre que el
compilador no te dé un error por la declaración (tampoco creo que cueste
mucho poner float divide :)
Caulquier compilador estandar dara un error por que no se puede poner
un valor de retorno en una funcion que devuelve void. Igualmente
cualquier compilador que cumpla minimamente con el estandar (yo diria
todos) dara un error en la asignacion 'v=fun()' cuando fun se ha
declarado void.

Una funcion en C no tiene por que devolver nada. Cuando en una funcion
se pone return X, dependera de la implementacion del compilador el
mecanismo de devolucion de X. Por ejemplo, los compiladores para i386
suelen devolver un int en AX o EAX, pero la devolucion de una
estructura puede ser realizada en la pila.

Un saludo,
Martin.
ViKT0RY
2003-09-11 07:31:32 UTC
Permalink
Cierto, pero por defecto TODAS las funciones dejarán algun valor en EAX,
aunque sea el mismo valor que se le pasó a la funcion, y ese valor, es el
valor devuelto. Si se devuelve el puntero a una estructura se devolverá en
EAX. El recojer o ignorar el valor devuelto es cosa de la declaración de la
funcion.
Martin J. Sanchez
2003-09-11 08:42:42 UTC
Permalink
ViKT0RY escribió en mensaje ...
Post by ViKT0RY
Cierto, pero por defecto TODAS las funciones dejarán algun valor en EAX,
aunque sea el mismo valor que se le pasó a la funcion, y ese valor, es el
valor devuelto. Si se devuelve el puntero a una estructura se devolverá en
EAX. El recojer o ignorar el valor devuelto es cosa de la declaración de la
funcion.
El mecanismo de devolucion de una estructura (o cualquier valor) no esta
descrito en el estandar. Cada implementacion realiza lo que desea como
quiere.

Por cierto cuando hablaba de devolucion de estructuras me referia a
estructura, no a punteros. Por ejemplo, el compilador puede generar un
frame antes de la llamada de la funcion para recibir alli la estructura
(de forma oculta) y eliminar aquel frame a la vuelta de la funcion. Lo
mismo sucede con doubles, un compilador puede generar codigo para
devolver el valor en registros especiales (por ejemplo los registros de
un coprocesador).

Cada implementacion hace lo que le da la gana, si engañas al compilador
para que tome el valor devuelto por una funcion void (proporcionando un
prototipo equivocado en otra unidad de translacion), el comportamiento
es impredecible, y su uso ilegal (segun el estandar). Por ejemplo, el
llamador podria realizar un pop de la pila usada por el coprocesador y
al estar vacia podria generar una excepcion.

Un saludo,
Martin.
znôrt
2003-09-14 18:35:38 UTC
Permalink
On Thu, 11 Sep 2003 09:31:32 +0200, "ViKT0RY"
Post by ViKT0RY
Cierto, pero por defecto TODAS las funciones dejarán algun valor en EAX,
aunque sea el mismo valor que se le pasó a la funcion, y ese valor, es el
valor devuelto. Si se devuelve el puntero a una estructura se devolverá en
EAX. El recojer o ignorar el valor devuelto es cosa de la declaración de la
funcion.
Y en una máquina que no tenga EAX o no tenga pila, no hay compilador
de C? ;-)

Yo creo que os estáis liando con la pila. A nivel conceptual, void es
lo mismo que nada. Si digo que devuelve void, estoy diciendo que
devuelve nada ... es sencillo, no? :D

TODAS las funciones tienen un RETORNO, por su misma naturaleza, a
menos de que se interrumpa el hilo de ejecución. Que ese retorno vaya
o no acompañado de resultado comestible es otra cosa.

Respecto a la duda inicial, no concuerda el tipo de retorno declarado
con el que efectivamente se retorna y eso, evidentemente, es un error.
Pa eso están los prototipos.

saludos
znôrt

Fernando Arbeiza
2003-09-11 05:59:15 UTC
Permalink
Post by Kenzo-Xs
void divide (int a, int b) {
float c;
c = (float) a / b;
return c;
}
Bueno, nada mejor que buscar un poco en la norma de C:

A return statement with an expression shall not appear in a
function whose return type is void. A return statement without
an expression shall only appear in a function whose return type
is void.

If a ``shall'' or ``shall not'' requirement that appears
outside of a constraint is violated, the behavior is undefined.
Undefined behavior is otherwise indicated in

Lueno no debería aparecer ningún valor con el return. Puesto que
aparece, se está invocando un comportamiento indefinido. La función
puede hacer lo que quiera.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Kenzo-Xs
2003-09-11 07:55:59 UTC
Permalink
Ok , entonces si mi poco ingles no me engaña , es que no deberia haber una
funcion RETURN si hay un VOID NO
Ese seria el fallo?

Saludos y gracias a todos por las respuestas
Post by Fernando Arbeiza
Post by Kenzo-Xs
void divide (int a, int b) {
float c;
c = (float) a / b;
return c;
}
A return statement with an expression shall not appear in a
function whose return type is void. A return statement without
an expression shall only appear in a function whose return type
is void.
If a ``shall'' or ``shall not'' requirement that appears
outside of a constraint is violated, the behavior is undefined.
Undefined behavior is otherwise indicated in
Lueno no debería aparecer ningún valor con el return. Puesto que
aparece, se está invocando un comportamiento indefinido. La función
puede hacer lo que quiera.
Un saludo.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2003-09-11 08:27:34 UTC
Permalink
Ok , entonces si mi poco ingles no me engaña,es que no deberia haber una
funcion RETURN si hay un VOID NO
Perdona, tanta manía de leer en inglés ya uno no se da cuenta. De todas
formas, es muy útil saber leer inglés para programar, así que, por
desgracia, creo que te vas a tener que acostumbrar ;-)

Bueno, te traduzco:

Una sentencia return seguida de expresión _no debería_ aparecer en
una función cuyo tipo devuelto sea void. Una sentencia return sin
ninguna expresión _sólo debería_ aparecer en una función cuyo tipo
devuelto sea void.

Si se viola un requisito _''debería''_ o _''no debería'' que
aparezca en una restricción, el comportamiento es indefinido.

Luego el comportamiento es indefinido, y el compilador puede hacer lo
que crea oportuno. Luego es ahí donde está el fallo.

Bueno, ahora tres _sugerencias_ sobre las news, para que esto funcione mejor:

- Si contestas debajo del mensaje, recortando lo que no sea
necesario, quedará más claro, y será más fácil seguir el hilo.

- No creo que a nadie le importe que preguntes dudas sobre tus
exámenes, pero recuerda que las preguntas de C aquí, y las de C++
en es.comp.lenguajes.c++

- Y, por último, si de verdad piensas que pertenecen a los dos
grupos (en tu caso no, pues ya has dicho que tu examen es de C),
debes incluir los dos grupos en el artículo, no enviar el artículo
dos veces (como ya te han indicado).

Un saludo, y que te vaya bien el examen.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Kenzo-Xs
2003-09-11 09:10:08 UTC
Permalink
Post by Fernando Arbeiza
Ok , entonces si mi poco ingles no me engaña,es que no deberia haber una
funcion RETURN si hay un VOID NO
Perdona, tanta manía de leer en inglés ya uno no se da cuenta. De todas
formas, es muy útil saber leer inglés para programar, así que, por
desgracia, creo que te vas a tener que acostumbrar ;-)
Una sentencia return seguida de expresión _no debería_ aparecer en
una función cuyo tipo devuelto sea void. Una sentencia return sin
ninguna expresión _sólo debería_ aparecer en una función cuyo tipo
devuelto sea void.
Si se viola un requisito _''debería''_ o _''no debería'' que
aparezca en una restricción, el comportamiento es indefinido.
Luego el comportamiento es indefinido, y el compilador puede hacer lo
que crea oportuno. Luego es ahí donde está el fallo.
- Si contestas debajo del mensaje, recortando lo que no sea
necesario, quedará más claro, y será más fácil seguir el hilo.
- No creo que a nadie le importe que preguntes dudas sobre tus
exámenes, pero recuerda que las preguntas de C aquí, y las de C++
en es.comp.lenguajes.c++
- Y, por último, si de verdad piensas que pertenecen a los dos
grupos (en tu caso no, pues ya has dicho que tu examen es de C),
debes incluir los dos grupos en el artículo, no enviar el artículo
dos veces (como ya te han indicado).
Hobre quizas no pertenezca a c++ lo que pasa es que pienso que tambien me
pueden ayudar alli , y cuando un esta desesperado como yo

Por cierto como se hace eso de mandar el mismo mensaje a los dos grupos?
Tendria que poner algo como OT?

Saludos y gracias
Post by Fernando Arbeiza
Un saludo, y que te vaya bien el examen.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2003-09-11 11:58:30 UTC
Permalink
Post by Kenzo-Xs
Hobre quizas no pertenezca a c++ lo que pasa es que pienso que tambien me
pueden ayudar alli , y cuando un esta desesperado como yo
Entiendo que los nervios de un examen te hagan precipitarte. Pero yo
creo que la cosa es así, si alguien quiere leer artículos sobre c se
suscribe a es.comp.lenguajes.c, si quiere leerlos de c++ se suscribe a
es.comp.lenguajes.c++, y si lo quiere leer de los dos se suscribe a los
dos. Luego si alguien quiere hablar contigo de C, estará aquí; si es con
el C++, estará en es.comp.lenguajes.c++.

Por cierto, mejor lo de responder debajo ;-), pero mucho mejor si
recortas lo superfluo. No te lleva mucho tiempo, y no tenemos que buscar
lo que tú has escrito.
Post by Kenzo-Xs
Por cierto como se hace eso de mandar el mismo mensaje a los dos grupos?
Tendria que poner algo como OT?
No, simplemente cuando mandes el mensaje tienes que incluir los nombres
de los dos grupos separados por comas en la cabecera, en lugar de uno
sólo. De esta forma, el mismo mensaje aparecerá en los dos grupos (ojo,
comprueba que el mensaje entra dentro de la temática de los grupos a los
que mandas).

La etiqueta OT es algo completamente diferente. Se marca así un mensaje
que está fuera de la temática (de Off-Topic) de un grupo. Normalmente no
se suele hacer, pues la gente acude a un grupo de noticias para leer
sobre el tema que le interesa; no sobre cualquier otro.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
J.A. Gutierrez
2003-09-12 09:15:35 UTC
Permalink
:> Por cierto como se hace eso de mandar el mismo mensaje a los dos grupos?
:> Tendria que poner algo como OT?

: No, simplemente cuando mandes el mensaje tienes que incluir los nombres
: de los dos grupos separados por comas en la cabecera, en lugar de uno
: sólo.

...y ademas incluir una cabecera Followup-To al grupo de los
enviados que sea mas apropiado para continuar con el tema.
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Julián Albo
2003-09-11 14:38:18 UTC
Permalink
Post by Kenzo-Xs
Ok , entonces si mi poco ingles no me engaña , es que no deberia haber una
funcion RETURN si hay un VOID NO
return no es una función, y RETURN no es lo mismo que return.

Pues no, si la función es void puede haber un return. Un return sin
argumentos, claro.

Salu2
Kenzo-Xs
2003-09-11 15:24:59 UTC
Permalink
Pero el return al que me refiero si tiene argumentos no?
Post by Kenzo-Xs
Ok , entonces si mi poco ingles no me engaña , es que no deberia haber una
funcion RETURN si hay un VOID NO
return no es una función, y RETURN no es lo mismo que return.

Pues no, si la función es void puede haber un return. Un return sin
argumentos, claro.

Salu2
Julián Albo
2003-09-11 15:28:06 UTC
Permalink
Post by Kenzo-Xs
Pero el return al que me refiero si tiene argumentos no?
Hombre... sabrás ver eso por ti mismo ¿no?

Salu2
Kenzo-Xs
2003-09-11 15:31:54 UTC
Permalink
:-(
Pero mira que estoy pez . lo siento pero uno cuando no sabe es que esta
inseguro hasta de lo mas evidente
Gacias
Post by Kenzo-Xs
Pero el return al que me refiero si tiene argumentos no?
Hombre... sabrás ver eso por ti mismo ¿no?

Salu2
Loading...