Los foros del Guille

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

Google
 

Regálate mi libro de Visual Basic 2005
Todo lo explicado es para .NET 2.0.
El complemento ideal para mi libro Novedades de Visual Basic 9.0

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

15/jun/2007
Cuando hagas una consulta, por favor indica que versión del lenguaje estás usando y procura hacer la pregunta en el foro más adecuado... para eso hay varios.
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-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 182 - App. iniciada: 24/11/2017 1:38:24 GMT - La hora GMT del servidor es: 24/11/2017 03:48:08 GMT