Autor |
Mensaje |
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
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
í
|
|
|
|
|
|
|
|
|
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
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...
|
|
|
|
|
|
|
|
|
Izanagi
Nivel 7
Edad: 36
Registrado: 21 Ago 2008
Mensajes: 402
Ubicación: Belgrano
Carrera: No especificada
|
|
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.
|
|
|
|
_________________
[Campaña]Revivamos el Chat Fiuba
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
|
|
|
joephantom
Nivel 9
Edad: 87
Registrado: 30 Jul 2007
Mensajes: 1510
Ubicación: Violando tus prejuicios
Carrera: Electrónica y Informática
|
|
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
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
¿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 ) 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 .
|
|
|
|
_________________
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
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)
|
|
|
|
_________________
|
|
|
|
|
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
La historia esta linda, pero no entendí como aplicarlo a mi problema
de minuto lo solucioné comparando directamente, no usando casteos...
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Moises escribió:
|
La historia esta linda, pero no entendí como aplicarlo a mi problema
|
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++...
|
|
|
|
_________________
|
|
|
|
|
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
Ah, queria pasar la í a su correspondiente codigo ascii (?)
í a 237
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
'í' 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.
|
|
|
|
_________________
|
|
|
|
|
Moises
Nivel 8
Edad: 35
Registrado: 26 Sep 2007
Mensajes: 727
Carrera: No especificada
|
|
si
gracias
----
bash-3.2$ ./a.out
237
|
|
|
|
|
|
|
|
|
joephantom
Nivel 9
Edad: 87
Registrado: 30 Jul 2007
Mensajes: 1510
Ubicación: Violando tus prejuicios
Carrera: Electrónica y Informática
|
|
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
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
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.
|
|
|
|
_________________
|
|
|
|
|
|
Ir a página 1, 2 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 CrackerTracker365 Attacks blocked.
|