Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

Ya está a la venta Novedades de Visual Basic 9.0

Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

21/nov/2005
Por favor no repitas el mismo mensaje en varios foros, ya que sino, al final tendré que tomar medidas con los "repetidores".
Gracias.

  Foro: C / C++.General Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 56392 - Problema con el printf
IDAsuntoFechaNick 
56392 Problema con el printf04/05/12 15:06Mr. VB 6   
Buenas otra vez.
En el siguiente codigo, CRacional es una clase que tiene dos signed int (Numerador y Denominador).
CRacional r(5,3); //Crea el racional 5/3.
printf("%d / ",r.Numerador);
printf("%d\n",r.Denominador);

printf("%d / %d\n",r.Numerador,r.Denominador);
printf("%d / %d\n",r.Denominador,r.Numerador);
Y cuya salida es:
5 / 3
5 / 0
3 / 0
y no se porque no anda bien el printf. Ya me habia pasado antes pero no le di importacia. Alguna idea?
[Editado: Mr. VB 6, 04/05/2012 15:06:57]
IDAsuntoFechaNick 
56394 Re: Problema con el printf (Resp: 56392)05/05/12 02:27Asterixco   
Parece como si hubiera una discrepancia entre el ancho real en bytes de Numerador y Denominador, y el ancho que entiende printf al leer %d. ¿Qué dice por ejemplo printf("%d\n",sizeof(r.Numerador)); ?

--------------------------------
Ramón Sola
(Para ayudar en lo que se pueda)


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
56395 Re: Problema con el printf (Resp: 56394)05/05/12 18:54Mr. VB 6   
Numerador y Denominador son signed long long int (por ahi sea exagerado, pero me lo pidieron asi), pero al parecer tenes razon: lo cambie a signed long int y funciono. Alguna idea de como implementarlo con long long?

Muchas gracias.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
56396 Re: Problema con el printf (Resp: 56395)06/05/12 00:46Asterixco   
Ahí está la explicación. Suponiendo compilación para x86 de 32 bits, long long presenta un ancho de 64 bits, mientras que int y long son de 32 bits (en otras plataformas los anchos pueden variar). La especificación %d le estaba indicando a printf que el argumento que venía era un int (4 bytes), cuando en realidad se le había pasado un parámetro de 8 bytes.
r. Numerador = 5 se almacena físicamente como 05 00 00 00 00 00 00 00 (Intel x86 es una arquitectura little-endian). A printf se le pasa una copia del valor, por lo que el primer %d toma 05 00 00 00 y el segundo %d toma 00 00 00 00.

La especificación de formato para long long con signo depende de la plataforma y el compilador (o más concretamente la biblioteca estándar de C). En la biblioteca de C de Microsoft es %I64d mientras que otras implementaciones entienden %lld. Conviene consultar la documentación de printf en cada caso particular y tener en cuenta las diferencias si se pretende que el código sea "portable".


--------------------------------
Ramón Sola
(Para ayudar en lo que se pueda)
[Editado: Asterixco, 06/05/2012 00:46:56]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2018  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8793)
 
Usuarios activos: 14 - App. iniciada: 20/09/2018 6:04:25 GMT - La hora GMT del servidor es: 20/09/2018 06:42:31 GMT