Home Menu

Menu



Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 31/10/11, 17:50:25
Avatar de bicho_visacoso
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
Mensajes: 50
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend
Mencionado: 1 comentarios
Tagged: 0 hilos
¿Como se traduce esta instruccion de C a Java?

Hola de nuevo, estoy intentando traducir un programa de C a android pero me he encontrado con una operacion que no conocia y no entiendo como funciona para traducirla a java.

int x += (i=leer_int()) && 1;

¿como interpreta esto el compilador de c?

Muchas gracias y un saludo.
David
Responder Con Cita


  #2  
Viejo 01/11/11, 11:13:31
Avatar de pmaicas
pmaicas pmaicas no está en línea
Desarrollador
Mensajes: 1,299
 
Fecha de registro: dic 2008
Mensajes: 1,299
Mencionado: 25 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por bicho_visacoso Ver Mensaje
Hola de nuevo, estoy intentando traducir un programa de C a android pero me he encontrado con una operacion que no conocia y no entiendo como funciona para traducirla a java.

int x += (i=leer_int()) && 1;

¿como interpreta esto el compilador de c?

Muchas gracias y un saludo.
David
Lo que hace es ejecutar leer_int() y asignarlo a i, y si ese mismo valor es diferente de cero le suma uno a x.

En C todo lo que no sea 0 es true, y el resultado de evaluar true es 1, no se si me explico.

en java queda incluso mas raro:

int x += (i=leer_int()) != 0 ? 1 : 0;


http://groups.google.es/groups/searc...+gusta+el+C%22

Última edición por pmaicas Día 01/11/11 a las 11:22:13
Responder Con Cita
  #3  
Viejo 01/11/11, 15:43:05
Avatar de bicho_visacoso
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
Mensajes: 50
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend
Mencionado: 1 comentarios
Tagged: 0 hilos
Ok, ahora lo veo, pero me he encontrado otras mas raras...

int status = (funcion_void(), !num_int);

¿como se interpreta esto si la funcion es void y no da informacion para evaluar una condicion?
Responder Con Cita
  #4  
Viejo 01/11/11, 17:21:58
Avatar de pmaicas
pmaicas pmaicas no está en línea
Desarrollador
Mensajes: 1,299
 
Fecha de registro: dic 2008
Mensajes: 1,299
Mencionado: 25 comentarios
Tagged: 0 hilos
Esta es facil, se evalua la funcion vodi que devuelve void, se evalua la segunda que devuelve int y ese int se asigna a status (bueno, no exactamente, lo que se asigna es 0 o 1 segun el valor devuelto sea distinto de cero o cero, por el !) . No se si java permite escribir lo mismo, pruebalo. Una lista de expressiones separadas por comas simplemente se evaluan una por una de izquierda a derecha.

Hay o había concursos de C 'oscuro' que no me acuerdo como se llamaban, se trata de hacer algo que funcione pero que el código sea imposible de interpretar por un humano
Responder Con Cita
  #5  
Viejo 01/11/11, 18:18:40
Avatar de bicho_visacoso
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
Mensajes: 50
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend
Mencionado: 1 comentarios
Tagged: 0 hilos
Pues esta última no se si la acabo de entender... voy a probar a compilar varios ejemplos a ver que resultados obtengo.

En esta otra (mira que encuentro código ofuscado XD) según tu anterior explicación se evaluaría primero la función que lee 2 bytes (los lee del propio fichero ifp) y luego evaluaria los siguientes 4 bytes del fichero... ¿pero con qué los compara? ¿es la suma de ambos lo que se suma a j?

fseek (ifp, j+(get2bytes(),get4bytes()), SEEK_SET);

Este código rompe todas las normas de programación estructurada que conozco.

Y esta ya es la releche desde mi punto de vista

int flip = "50132467"[get2bytes() & 7]-'0'; <--- Esa cadena de números sale de la nada

intuyo que lee dos bytes de un fichero, hace la comparación binaria con 7 y caso de que el resultado no sea cero ... mi cerebro explota otra vez

Y yo creia que sabía programar en C.
Responder Con Cita
  #6  
Viejo 02/11/11, 12:36:45
Avatar de pmaicas
pmaicas pmaicas no está en línea
Desarrollador
Mensajes: 1,299
 
Fecha de registro: dic 2008
Mensajes: 1,299
Mencionado: 25 comentarios
Tagged: 0 hilos
'ofuscado' era ofuscado y no oscuro, no me salía la palabra

Una lista separada por comas simplemente se ejecuta (he dicho antes evalua como sinónimo de ejecutar, no de comparar) de izquierda a derecha, el valor devuelto es el que devuelve la ultima expresion.

Es decir que fseek (ifp, j+(get2bytes(),get4bytes()), SEEK_SET); es lo mismo que estas dos lineas:
get2bytes();
fseek (ifp, j+get4bytes(), SEEK_SET);

Yo nunca uso la lista separada por comas, porque no aporta nada, si quiero usar menos lineas prefiero:
get2bytes(); fseek (ifp, j+get4bytes(), SEEK_SET);

Para "50132467"[get2bytes() & 7]-'0'; debes tener en cuenta que & es un and aritmético (no lógico), y que ese string es en realidad un array de bytes.
Por ejemplo, supongamos que get2bytes devuelva 20, entonces 20 & 7 son 4, y el caracter que ocupa la posicion 4 en el array es '2', y el resultado es '2'-'0' que es 2. El asci de '0' es 48, y el de '2' es 50, por eso el resultado es 2 (no '2', ojo).
Responder Con Cita
  #7  
Viejo 03/11/11, 00:41:30
Avatar de bicho_visacoso
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
Mensajes: 50
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend
Mencionado: 1 comentarios
Tagged: 0 hilos
Genial, ha sido una lección magistral de C. Muchisimas gracias

Creo que he hecho implementaciones correctas en java de todos esos casos (aún tengo que hacer muchas pruebas) y nunca hubiera podido sin tus explicaciones. Es increíble lo difícil que es encontrar esa información en internet.

Igual me he dejado alguna en el tintero, no te alejes mucho que tal vez necesite abusar un poco más de tu conocimiento y paciencia.

Muchas gracias y un saludo.
David.
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 22:32:32 (GMT +1)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007