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

Respuesta
 
Herramientas
  #1  
Viejo 31/10/11, 17:50:25
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

¿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
Array

[xs_avatar]
pmaicas pmaicas no está en línea
Desarrollador
 
Fecha de registro: dic 2008
Mensajes: 1,299

 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
__________________
Saludos
-Pedro-
http://www.maicas.net/ (desarrollo de software)
http://droid.maicas.net/ (solo android)

Ú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
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

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
Array

[xs_avatar]
pmaicas pmaicas no está en línea
Desarrollador
 
Fecha de registro: dic 2008
Mensajes: 1,299

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
__________________
Saludos
-Pedro-
http://www.maicas.net/ (desarrollo de software)
http://droid.maicas.net/ (solo android)
Responder Con Cita
  #5  
Viejo 01/11/11, 18:18:40
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

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
Array

[xs_avatar]
pmaicas pmaicas no está en línea
Desarrollador
 
Fecha de registro: dic 2008
Mensajes: 1,299

'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).
__________________
Saludos
-Pedro-
http://www.maicas.net/ (desarrollo de software)
http://droid.maicas.net/ (solo android)
Responder Con Cita
  #7  
Viejo 03/11/11, 00:41:30
Array

[xs_avatar]
bicho_visacoso bicho_visacoso no está en línea
Miembro del foro
 
Fecha de registro: sep 2010
Mensajes: 50
Modelo de smartphone: HTC Legend

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   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 10:55:51 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /