El reto de la semana (3)

A ver... que estamos muy paradetes...

El problema consiste en hacer un programa C que permita conocer el endian de la máquina en que se ejecuta.

Fácil, fácil, ¿eh?

¿Sabríais hacerlo en otros lenguajes (Java, por ejemplo)?

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de int-0

Esto vale o es trampa?

// Ahh... por cierto... esto es freepascal (juajuajuajua)
Program endian;
Begin
{$IFDEF ENDIAN_BIG}
writeln ('Máquina big-endian');
{$ELSE}
writeln ('Máquina little-endian');
{$ENDIF}
End.

Compiláis con fpc y podéis ejecutar directamente lo que se genera. Supongo que con directivas del compilador de podrá hacer en cualquier lenguaje de forma similar (en java tengo curiosidad ya que la JVM es big-endian...)

El pascal no ha muerto! jajaja... por cierto... el programa también compila para Palm Eye-wink.
------------------------------------
init=/bin/bash to conquer the world!

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de magmax

No está mal...

... pero bien tampoco.

Confías en que el sistema operativo y/o en el compilador.

Hay maneras de hacerlo más general...

Miguel Ángel García
http://magmax.org

Imagen de int-0

Pues claro que confío!

Pues claro que confío en el compilador!! y tu también al escribir un programa para uno de ellos!! ese argumento no me valdría para desechar mi solución... supongo que lo que tu habrás hecho será escribir un word en memoria y comprobar alguno de los dos bytes... no? pues a mi esa solución me parece peor que preguntárselo al propio compilador de la arquitectura... ¿son opiniones? Eye-wink
------------------------------------
init=/bin/bash to conquer the world!

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de david.villa

jeje

si lo necesitas para una práctica, pregúntale a tu profesor, hombre Sticking out tongue
Si te vale en python, sería:

$ python -c "import sys; print sys.byteorder"

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de magmax

Pues no, la verdad

La historia es la siguiente: Lo necesitaba en el curro, así que lo implementé. Y después de eso, me pareció un temilla curioso para preguntarlo aquí, así que lo puse.

Mi solución ya está hecha, y la publicaré cuando alguien dé una buena solución en C o cuando cumpla la semana ;)

Como solución en Python está bien. En mi problema personal no me valía, ya que dudo que se haya compilado python para máquinas tan raras como un S390 :-D

Por cierto... Además del byteorder necesité otra cosa, por lo que ya tengo preparado el reto de la semana siguiente... ;)

Miguel Ángel García
http://magmax.org

Imagen de david.villa

Curiosidad

Para hacer código portable lo normal es llamar a una función (hton, ntoh) que te pase tu dato a un ordenamiento concreto. Esta función hará la conversión o no dependiendo del ordenamiento nativo. ¿Por qué poner “if’s” en tu programa si pueden estar en la librería estándar?

Por curiosidad, ¿qué necesita hacer tu programa para que no se ajuste a este planteamiento?

¿Por qué no iba a estar Python para el s390? Si hay un compilador de C o una JVM puede haber un interprete de Python.

PS: Yo estoy con Tobías, quién mejor lo sabe es el compilador, que es el crea ejecutables para tu arquitectura concreta.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de admin

Respuestas a tu curiosidad.

El planteamiento está muy bien, y debería ser "el" válido. Pero no suele ser así cuando estás en una empresa y tienes que tocar el código que han picado otros. A menudo, no tienes tiempo suficiente, y lo que necesitas es que funcione lo que han hecho Laughing out loud

No sabía que Python estaba para ese PC tan feo, pero es interesante....

Y respecto a lo de Tobías... Es muy bonito, pero puedes tener problemas cuando el compilador se ajusta perfectamente al estándar (o, al menos, a alguno de ellos) y decide que en lugar de "BIGENDIAN" se va a llamar "ENDIAN_BIG". Parece mentira, pero ocurre.

Imagen de int-0

Pues que sepas...

A mi lo de escribir un dato de más de un byte y leer luego un sólo byte para ver cómo lo ordenó me parece que no es elegante... es más, creo que puede darse el caso en que falle: por ejemplo, ya que hablamos de compiladores extraños, imagina uno que use una representación intermedia de los datos a la hora de almacenarlos... tu sistema de va de baretas... y si no conoces bien el compilador que usas (que es algo que supongo, ya que dices que no sabes los símbolos que define) no puedes asegurar que estés realizando una comprobación certera.
------------------------------------
init=/bin/bash to conquer the world!

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de david.villa

Cuando dices que en la

Cuando dices que en la empresa no tienes tiempo suficiente, entiendo que te refieres a suficiente para hacerlo bien. Entonces, por qué le dices a Tobias que “bien tampoco”?

Averiguar el ordenamiento no debería ser responsabilidad de un programa que pretenda ser portable. La portabilidad te la da el compilador y la librería estándar.

Si usas el mismo compilador en diferentes arquitecturas es de esperar que las constantes definidas para estas cosas se llamen igual, porque sino ¿para qué valdrían?

Pero vamos, que si no te quieres fíar del compilador, quizá si que te quieras fiar de la librería estándar:


#include
#include

int main()
{ puts ((htons(0×8000) == 0×8000) ? “Big endian” : “Little endian”); return 0;
}

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de admin

Pues no...

Cuando digo que no tengo tiempo suficiente es porque tengo cosas que hacer más importantes que estar revisando el código de todo el resto de programadores, amén de que aún me falta bastante experiencia a mí.

A Tobías le dije que "bien tampoco" por el simple hecho de que está programando mediante el preprocesador, y no todos los compiladores tienen las mismas directivas.

De todas maneras, debo decir que, ahora, la solución de Tobías me parece tan buena como cualquier otra.

Sin embargo, creo que ya hemos salido completamente de la intención inicial de este hilo, por lo que considero que no merece la pena darle más vueltas. Ya tenemos varias soluciones. La que yo di en su momento era la siguiente (que no es la mejor, ni mucho menos):

#include 

int main ()
{
   int i = 1;
   char* c;

   c = (char*)&i;

   printf(*c == 0?"Bigendian":"Littleendian");
   return 0;
}

En vista de que hay gente que se toma tan a pecho el "reto de la semana", no volveré a proponer ninguno más. Ea.

Imagen de david.villa

Hombre!

Se supone que es un reto, no? Cuando propones un reto, estás retando a la gente, de eso va esto, o eso pensaba yo. Perdón si te resultó ofensivo lo del tiempo suficiente, pero no me pareció bien que dijeras que la solución de Tobías era “buena tampoco” si la tuya no era mejor, con la escusa del tiempo. También creo que este reto es lo suficientemente autocontenido como para no depender del código de otros programadores.

Creo que para poner un reto no hace falta ser el propietario de “la solución”. Según tu mismo decías, y estoy de acuerdo, lo bueno de los retos es que hablemos de las ventajas e inconvenientes de cada posible solución y discutamos cuál es la mejor, pero eso no implica que el retador tenga que defender su propuesta (si la tiene) a capa y espada.

Lo dicho, perdón por mi parte y vuelve a los retos, no nos abandones!

PS: Por favor, no “postees” como admin que así no se sabe quién eres…

GNU/Linux: armonía y entendimiento

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de magmax

posts como admin

sorry... no me di cuenta de que estaba como admin.

Yo también siento si ha parecido que yo era el "propietario de la solución". La solución no es única, evidentemente, pero, en un primer vistazo, me parecía que la solución de Tobías podía dar problemas al emplear otros compiladores diferentes. No se me había ocurrido pensar que con la mía (por ejemplo) podía ocurrir igual.

Aun así, creo que este reto era interesante. ¿no crees?

PD: Respecto a lo de abandonarlos... ya veré Sticking out tongue

Miguel Ángel García
http://magmax.org

Imagen de david.villa

Claro

Todo lo que genera polémica es interesante por definición Sticking out tongue

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.