Foros-FIUBA Foros HostingPortal
 FAQ  •  Buscar  •  Wiki  •  Apuntes  •  Planet  •  Mapa  •  Eyeon  •  Chat
Preferencias  •  Grupos de Usuarios
Registrarse  •  Perfil  •  Entrá para ver tus mensajes privados  •  Login
Ver tema siguiente
Ver tema anterior

Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente
Autor Mensaje
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Sab Nov 22, 2008 4:33 pm  Asunto:  casteo a char C++ Responder citandoFin de la PáginaVolver arriba

A ver dioses del C++
Necesito su colaboración


Si 'harcodeo' una "í" (i con tilde) y luego hago un casteo me tira que es el -19 !!!
wtf?


#include <iostream>
#include <string>
int main() {
std::string algo = "í";
std::cout <<(int) algo[0] << std::endl;
return 0;
}
bash-3.2$ c++ c.cpp
bash-3.2$ ./a.out
-19


que rayos?
porque no me tira que es 237?
probe con char en vez de string y nose.. no anda.

Ahora, si casteo el 237 como char anda bien !!



#include <iostream>
#include <string>
int main() {
std::string algo = "í";
std::cout <<(int) algo[0] << std::endl;
int asdf = 237;
std::cout <<(char) asdf << std::endl;
return 0;
}
bash-3.2$ c++ c.cpp
.bash-3.2$ ./a.out
-19
í


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Sab Nov 22, 2008 4:42 pm  Asunto:  Re: casteo a char C++ Responder citandoFin de la PáginaVolver arriba

Moises escribió:
A ver dioses del C++
Necesito su colaboración


Si 'harcodeo' una "í" (i con tilde) y luego hago un casteo me tira que es el -19 !!!
wtf?


#include <iostream>
#include <string>
int main() {
std::string algo = "í";
std::cout <<(int) algo[0] << std::endl;
return 0;
}
bash-3.2$ c++ c.cpp
bash-3.2$ ./a.out
-19


que rayos?
porque no me tira que es 237?
probe con char en vez de string y nose.. no anda.

Ahora, si casteo el 237 como char anda bien !!



#include <iostream>
#include <string>
int main() {
std::string algo = "í";
std::cout <<(int) algo[0] << std::endl;
int asdf = 237;
std::cout <<(char) asdf << std::endl;
return 0;
}
bash-3.2$ c++ c.cpp
.bash-3.2$ ./a.out
-19
í




Edit

Me paso algo loco.
Cambie la codificacion de mi sistema de iso88591 a utf8, y ahora me arroja que es -61...(despues de haber cambiado el fichero y salvarlo con la nueva codificacion)
wtf?



Edit de nuevo

Ahora salve el archivo como iso8859 y me tira -19... igual,no anda...


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
Izanagi
Nivel 7


Edad: 36
Registrado: 21 Ago 2008
Mensajes: 402
Ubicación: Belgrano
Carrera: No especificada
argentina.gif
MensajePublicado: Sab Nov 22, 2008 6:03 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

a)
Cita:

Cambie la codificacion de mi sistema de iso88591 a utf8, y ahora me arroja que es -61...(despues de haber cambiado el fichero y salvarlo con la nueva codificacion)

Sí, es normal. Lo que pasa es que justamente estas cambiando la codificación del sistema, eso va a hacer que 'cambie' el caracter.

b)
Cita:

#include <iostream>
#include <string>
int main() {
std::string algo = "í";
std::cout <<(int) algo[0] << std::endl;
return 0;
}

No recuerdo mucho de C++(tiene toda la pinta de ser eclipse eso), pero podrias probar alguna de las siguientes:
1) Puede que guarde alguna información en la posición cero( 0 ) del string, proba con la posición 1. Es poco probable pero bue, con probar no perdes nada.
2) Fijate si funciona usando un char a secas. Si funciona, castea la posicion del string a char y luego a int. ( int )( ( char )( cadena[ <Posicion> ] ) )

Lo voy a probar de todas formas y despues te digo que onda.

_________________
Image
[Campaña]Revivamos el Chat Fiuba

Leo Género:Masculino Gato OcultoGalería Personal de IzanagiVer perfil de usuarioEnviar mensaje privadoEnviar emailVisitar sitio web del usuarioMSN Messenger
Rada
Moderador


Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
blank.gif
MensajePublicado: Sab Nov 22, 2008 6:28 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

proba con el wchar

http://www.conclase.net/c/librerias/estructura.php?tip=lwchar_t

_________________
[CAMPAÑA] Colaboremos entre todos por un foro más ordenado (click aquí)
[CAMPAÑA] Hacer un tópico por cada curso y con información ¡útil! (click aquí)


Gabba gabba we accept you we accept you one of us

Tauro Género:Masculino Tigre OcultoGalería Personal de RadaVer perfil de usuarioEnviar mensaje privadoEnviar emailYahoo MessengerMSN Messenger
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Sab Nov 22, 2008 7:13 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

mmm


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
joephantom
Nivel 9


Edad: 87
Registrado: 30 Jul 2007
Mensajes: 1510
Ubicación: Violando tus prejuicios
Carrera: Electrónica y Informática
CARRERA.informatica.png
MensajePublicado: Sab Nov 22, 2008 8:48 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Rada escribió:
proba con el wchar

http://www.conclase.net/c/librerias/estructura.php?tip=lwchar_t


Así es. wchar_t permite guardar caracteres unicode (no en todos los sistemas, pero en la mayoría). Vas a tener que usar las funciones wcout y wcin para imprimir y obtener los datos.

_________________
LA UNIÓN EN EL REBAÑO OBLIGA AL LEÓN A ACOSTARSE CON HAMBRE.

Es buscando lo imposible que el hombre ha siempre realizado y reconocido lo posible. Aquellos que sabiamente se han limitado a lo que les pareciera posible no han dado un solo paso adelante - Mijail Bakunin

La teoría política no es una ciencia enigmática cuya jerarquía cabalística manejan unos pocos iniciados, sino un instrumento de las masas para desatar la tremenda potencia contenida en ellas. No les llega como un conjunto de mandamientos dictados desde las alturas, sino por un proceso de su propia conciencia hacia la comprensión del mundo que han de transformar - John William Cooke

Personally I'm in favor of democracy, which means that the central institutions in the society have to be under popular control. Now, under capitalism we can't have democracy by definition. Capitalism is a system in which the central institutions of society are in principle under autocratic control. Thus, a corporation or an industry is, if we were to think of it in political terms, fascist; that is, it has tight control at the top and strict obedience has to be established at every level -- there's a little bargaining, a little give and take, but the line of authority is perfectly straightforward. Just as I'm opposed to political fascism, I'm opposed to economic fascism. I think that until major institutions of society are under the popular control of participants and communities, it's pointless to talk about democracy. - Noam Chomsky


http://joephantom.net
Verborragia de mes yeux

Cancer Género:Masculino Rata OfflineGalería Personal de joephantomVer perfil de usuarioEnviar mensaje privadoEnviar emailVisitar sitio web del usuarioMSN MessengerNúmero ICQ
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Dom Nov 23, 2008 12:14 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

¿Qué tienen que ver los tipos multibyte cuando lo que está diciendo es otra cosa (es más, dijo estar usando un sistema single-byte)...?

El "error" no es tal; es perfectamente común, y, si bien, en cierto punto se ve un tanto extraño, es una herencia de C y está totalmente bien dentro de los parámetros.

Una string se implementa como un array de chars (más allá de string en el ejemplo que decís que te anda, estás usando char); en C y C++ salvo que se modifique el tipo, los tipos son signados. Ergo, un char a secas, es un tipo signado. No le queda otra que aceptar valores entre -128 y 127.

Historicamente, todo C se construyó usando las cadenas como char[] y no como unsigned char[]; cuando el char se standarizó en 8 bits (o, CHAR_BIT bits @ limits.h, mejor dicho :P) como que el tema ya era un tanto irremontable de modificar porque todas las funciones giraban en torno a eso.

La representación de chars extendidos en C tiene implícito un overflow que no debería afectar porque estás pasando de una representación entre 0 a 255 a una que tiene la misma cantidad de valores sólo que la segunda mitad mapeada en negativos.

Cuando vos decís (char)237 estás agarrando un número de sizeof(int)*CHAR_BIT bits y truncándolo a un número de CHAR_BIT bits, en el cual el MSB es el bit de signo. Hay un overflow, el bit que representaba la potencia del 128 termina siendo interpretado como bit de signo; un número que era positivo termina siendo negativo... pero está bien; tal vez no sea elegante, y C sería mucho más consistente si las cadenas fueran unsigned; pero así funciona y no hay drama.

Ojo, con una sola sutileza puntual de C en esto; EOF es un valor que está fuera de la tabla ASCII; funciones como getchar() devuelven no 256 valores diferentes sino 257 valores distintos. Por eso, si se fijan, el prototipo de getchar() dice que devuelve un entero. En particular, getchar() devuelve -1 como EOF y un ASCII en rango 0..255 para valores válidos. Ya desde el vamos, hacer "char c=getchar();" en C implica un overflow (ojo, si se quiere chequear EOF hay que usar un c de tipo int; si no, ÿ se confunde con EOF).

No sé si con esto se entendió tu problema. Más allá de eso, remarco, ni se te ocurra usar unsigned para chars; unsigned en C se usa sólo para bytes, no para caracteres. Todo en C está pensando en que las cadenas son signadas, no se cambió en décadas, ni se te ocurra cambiarlo a vos Wink.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Dom Nov 23, 2008 12:19 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Sólo a modo de complemento de lo anterior; el casteo entre tipos enteros en C se arma extendiendo con ceros o unos a izquierda un número según sea positivo o negativo; y luego agarrando los N bits que mide el tipo de destino...

Tal vez si lo piensan así entiendan mejor qué pasa cuando 'í' se castea en char o cuando 237 se en char. (en este caso, ambos casteos truncan)

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Dom Nov 23, 2008 12:22 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

La historia esta linda, pero no entendí como aplicarlo a mi problema :S
de minuto lo solucioné comparando directamente, no usando casteos...


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Dom Nov 23, 2008 12:31 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Moises escribió:
La historia esta linda, pero no entendí como aplicarlo a mi problema :S

Tal vez sea porque en ningún momento dijiste cuál era tu problema...

Señalaste que algo no funcionaba como esperabas, y te expliqué qué era lo que estabas haciendo y por qué ese comportamiento es totalmente esperado dentro de un lenguaje como C++...

Smile

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Dom Nov 23, 2008 12:37 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Ah, queria pasar la í a su correspondiente codigo ascii (?)
í a 237


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Dom Nov 23, 2008 12:40 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

'í' es su correspondiente código ASCII.

Un carácter entre comillas simples en C es reemplazado por el compilador por el número que representa ese carácter en la tabla local.

'í' == 237, en C, en Latin1 obviamente.

Tu error está en que cuando decís:
char c = 'í';
estás casteando ese 237 sobre un tipo donde no alcanza para guardar un número tan grande.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Moises
Nivel 8


Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727

Carrera: No especificada
israel.gif
MensajePublicado: Dom Nov 23, 2008 12:44 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

:S
si
xD

Oops


Mr. Green

gracias
----
bash-3.2$ ./a.out
237
Jajaja


Piscis Género:Masculino Serpiente OfflineGalería Personal de MoisesVer perfil de usuarioEnviar mensaje privado
joephantom
Nivel 9


Edad: 87
Registrado: 30 Jul 2007
Mensajes: 1510
Ubicación: Violando tus prejuicios
Carrera: Electrónica y Informática
CARRERA.informatica.png
MensajePublicado: Dom Nov 23, 2008 2:37 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Sebastian Santisi escribió:
Tal vez sea porque en ningún momento dijiste cuál era tu problema...


Sebastian Santisi escribió:
¿Qué tienen que ver los tipos multibyte cuando lo que está diciendo es otra cosa (es más, dijo estar usando un sistema single-byte)...?

Por qué según entendí, lo que busca, se puede arreglar con wchar_t. El TP que tiene que hacer, tiene que soportar caracteres de cualquier idioma (muchos no representables con ASCII). Usando tipos multibyte puede darle soporte a lo que necesita.

_________________
LA UNIÓN EN EL REBAÑO OBLIGA AL LEÓN A ACOSTARSE CON HAMBRE.

Es buscando lo imposible que el hombre ha siempre realizado y reconocido lo posible. Aquellos que sabiamente se han limitado a lo que les pareciera posible no han dado un solo paso adelante - Mijail Bakunin

La teoría política no es una ciencia enigmática cuya jerarquía cabalística manejan unos pocos iniciados, sino un instrumento de las masas para desatar la tremenda potencia contenida en ellas. No les llega como un conjunto de mandamientos dictados desde las alturas, sino por un proceso de su propia conciencia hacia la comprensión del mundo que han de transformar - John William Cooke

Personally I'm in favor of democracy, which means that the central institutions in the society have to be under popular control. Now, under capitalism we can't have democracy by definition. Capitalism is a system in which the central institutions of society are in principle under autocratic control. Thus, a corporation or an industry is, if we were to think of it in political terms, fascist; that is, it has tight control at the top and strict obedience has to be established at every level -- there's a little bargaining, a little give and take, but the line of authority is perfectly straightforward. Just as I'm opposed to political fascism, I'm opposed to economic fascism. I think that until major institutions of society are under the popular control of participants and communities, it's pointless to talk about democracy. - Noam Chomsky


http://joephantom.net
Verborragia de mes yeux

Cancer Género:Masculino Rata OfflineGalería Personal de joephantomVer perfil de usuarioEnviar mensaje privadoEnviar emailVisitar sitio web del usuarioMSN MessengerNúmero ICQ
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Dom Nov 23, 2008 10:06 am  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

joephantom escribió:
Por qué según entendí, lo que busca, se puede arreglar con wchar_t.

Si un carácter es wide, y es necesario leerlo en bloque (muchas veces no es necesario en lo absoluto), sí, wchar_t resuelve un problema.

Pero el problema que resuelve wchar_t es el de que en un encoding multibyte perdés la posibilidad de manejar una sarta de bytes como un único char.

wchar_t te resuelve el problema de calcular la longitud de una cadena, o de identificar un rango dentro de Unicode (bah, rango dentro de Unicode puede hacerse con char...), identificar un determinado carácter wide, etc..


El problema de un ASCII dentro de un char, no requiere meterse con wchar_t; es una herramienta para otros problemas.
joephantom escribió:
El TP que tiene que hacer, tiene que soportar caracteres de cualquier idioma (muchos no representables con ASCII). Usando tipos multibyte puede darle soporte a lo que necesita.

Peeeeero, primero, tiene que estar programando en multibyte, cosa que ya de entrada aclaró que no estaba haciendo.

Para que usar wides tenga sentido, toda la programación y el contexto tiene que ser wide, si no, no sirve. Y con programación + contexto me refiero tanto a la mentalidad con la que está programado desde el diseño como al sistema operativo en el que lo va a correr después.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
Mostrar mensajes de anteriores:      
Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente

Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro
No podés responder a temas en este foro
No podés editar tus mensajes en este foro
No podés borrar tus mensajes en este foro
No podés votar en encuestas en este foro
No Podéspostear archivos en este foro
No Podés bajar archivos de este foro


Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker
365 Attacks blocked.

Powered by phpBB2 Plus, phpBB Styles and Kostenloses Forum based on phpBB © 2001/6 phpBB Group :: FI Theme :: Mods y Créditos

Foros-FIUBA está hosteado en Neolo.com Cloud Hosting

[ Tiempo: 0.5364s ][ Pedidos: 20 (0.3982s) ]