Conversion de datos en C/C++

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Conversion de datos en C/C++

Notapor sofoke » Lun May 07, 2012 4:35 am

Hola, buenas noches a todos en el foro.
Alguien podria ayudarme con la conversion de tipos en C/C++?
Lo que sucede es que tengo una variable:
Código: Seleccionar todo
unsigned char r;

con un valor igual a 50, y este valor lo quiero pasar a una variable
Código: Seleccionar todo
unsigned short a;

pero al hacer algo asi:
Código: Seleccionar todo
a = (unsigned short) r;

o al hacer simplemente:
Código: Seleccionar todo
a = r;

no me da lo que necesito, puesto que la variable a la necesito para un for, pero no se que pasa incluso ya intente con la funcion atoi y no he logrado pasar ese valor :S
Desgraciadamente necesito que esas variables sean necesariamente de ese tipo. Si alguien puede ayudarme les estaria muy agradecido.
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Conversion de datos en C/C++

Notapor Barajas » Lun May 07, 2012 9:33 pm

solo una duda, exactamente como estas asignando el valor de "50" al carácter.
En teoria no marca error al hacerlo... :
Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
int main(void){
    unsigned char r;
    unsigned short a;
    r = 'a';  /*asignamos el carácter*/
    a = (unsigned short) r;  /*transformamos el tipo...*/
    printf("%d\n", a);/*imprime 97 que es el valor entero de 'a' */
    return 0;
};


Creo que el error esta en como asignas el valor a r... :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Conversion de datos en C/C++

Notapor sofoke » Lun May 07, 2012 11:05 pm

En realidad lo asigno de la siguiente manera:
Código: Seleccionar todo
...
fscanf( rFile, "%c", &leido );
sprintf( (char*) &room[ count ], "%c" , (char*) leido );
...

Donde:
room es un puntero a una variable de tipo unsigned char, y leido es una variable de tipo unsigned char.
Lo tengo de este modo puesto que leo un archivo con información en hexadecimal.
Por eso al hacer:

Código: Seleccionar todo
a = (unsigned short) room[10];


No me genera error de compilacion pero como a lo quiero usar en un for, cuando da una vuelta al for e intenta generar otra vuelta no se que sucede; pero el programa simplemente se cuelga como si el for no tuviera fin o algo por el estilo.
Ahora que veo el codigo pudo hacer que a no sea necesariamente unsigned short aun que lo quiero usar así por cuestión de ahorro de recursos.
Aun no se por que sucede eso :S.

Edito: Olvide comentar que a comienza con un valor 0x00 y al hacer algunas vueltas en el for al encontrarse con lo que comento ya no vuelve a hacer lo que normalmente debe hacer es como si tomara otro valor o el for no tuviera fin la verdad no se como explicarlo es raro :S...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Conversion de datos en C/C++

Notapor Barajas » Mié May 09, 2012 12:28 am

Que extraño, usualmente funcionaria... primero seria revisar si verdaderamente el dato al que le das cast. Aun que seria bueno poder ver un poco mas del código donde esta el error.
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Conversion de datos en C/C++

Notapor sofoke » Mié May 09, 2012 8:23 pm

Aqui un poco de codigo.
Comenzando por el codigo que se encarga de leer un archivo de texto en modo binario de lectura:
Código: Seleccionar todo
    strcat( (char*) room_inst[ count ], (char*) "" );
    do{
        fscanf( room, "%c", &leido );
        sprintf( (char*) &room_inst[ count ], "%c" , (char*) leido );
        count+=1;
    }while( !feof(room) );

Con este codigo lo que hago el leer el archivo hasta el final e ir guardando los datos dentro de la variable room_inst que es un arreglo de punteros de tipo unsigned char.
Al hacer una prueba con:
Código: Seleccionar todo
printf("\n%x\n", room_inst[1] );

Me imprime el valor 50
Ahora el archivo binario abierto se ve de la siguiente manera:
Código: Seleccionar todo
C3 50 01 FF FF
00 00 00 C3 00

Esto de modo grafico lo que significaria en hexadecimal:
Código: Seleccionar todo
0 1 2 3 4
5 6 7 8 9

Y en decimal seria lo siguiente:
Código: Seleccionar todo
195 80 1 255 255
0 0 0 195 80

Ahora como vemos el archivo trae un valor 50 que en decimal es 80 y su posicion segun los valores hexadecimales es 1... (En este ejemplo claro)
Ahora lo que quiero es poder jalar ese 50 a una variable unsigned short.
El siguiente codigo es:
Código: Seleccionar todo
for( ; PC <= 600 ;  ){
    opCode = room[PC];
    switch( opCode ){
        case (0xC3):
                break;
       default:
             PC+=1;
            break;
    }
}

Especificamente en ese case es donde necesito hacer la asignacion del valor 50 (que es el que tiene el archivo que lei en forma binaria) a la variable PC que como comento es unsigned short, puesto que sigo necesitando que se pueda usar tanto en el for como indice del arreglo de punteros.
Esta variable room es una copia de room_inst que hice de la siguiente manera:
Código: Seleccionar todo
room = (unsigned char*) room_inst;

Lo hice por que se encuentran en clases diferentes.
Casi lo olvido el archivo lo abro de la siguiente manera:
FILE* room = fopen(path, "rb");
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Conversion de datos en C/C++

Notapor Barajas » Jue May 10, 2012 4:41 pm

Disculpa la tardanza :)

Bien, ahora, una observación:

no se copean cadenas de esa forma
sofoke escribió:Esta variable room es una copia de room_inst que hice de la siguiente manera:

Código: Seleccionar todo
    room = (unsigned char*) room_inst;




Daria lo mismo que utilizaras directamente room_inst...

Ahora, lo que se me ocurre que puedes hacer es, crear un array de enteros y recorrer la longitud de room_inst.

#include <string.h>

int long = strlen(room_inst);
unsigned short* room_integer = (unsigned short*)malloc(sizeof(unsigned short)*long); //creamos un array de enteros para guardar los valores
int i;
for(i=0;i<=long;i++){
room_integer[i] = (unsigned short)room_inst[i];
};


Aun que estoy un poco oxidado en c :lol:, así que esa seria solo una idea... no sé si te sea útil...
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Conversion de datos en C/C++

Notapor sofoke » Jue May 10, 2012 7:01 pm

:shock: Wow! parece que ya quedo :D
El código me quedo de la siguiente manera:
Código: Seleccionar todo
    long long longitud = sizeof( room_inst );
    room = (unsigned char*) malloc( sizeof(unsigned char)*longitud );
    for( int i = 0 ; i <= longitud; i++ ){
        room[i] = (unsigned char) room_inst[i];
    }

Ahora ya quedo al hacer:
Código: Seleccionar todo
case (0xC3):
                SP = (int)  room[ PC+1 ];
                PC = (int) SP;
                break;

Hace exactamente lo que necesito guarda en PC el valor 50 (que solo es un ejemplo) o el valor que encuentre en el archivo y PC sigue siendo valido para el for y continua haciendo todo.
Ahora no entiendo el por que del error, podrías decirme por que no se hace la copia como lo hice yo?
Muchas gracias por la ayuda ya puedo continuar con mi pequeño proyecto :D
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Conversion de datos en C/C++

Notapor Barajas » Vie May 11, 2012 4:50 am

Sí el asunto era copear una sola cadena, creo que te hubiese sido mas útil el utilizar la función strcpy... bueno, ya que XD.

Sobre el problema de copear cadenas de la forma que lo hacías, es que técnicamente no copeas la cadena, mas bien haces referencia a esa cadena en especifico o algo así....

Me alegro que ya funcione :)

ahora tengo una duda existencial sobre si se escribe copear o copiar... XD
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Conversion de datos en C/C++

Notapor sofoke » Vie May 11, 2012 5:03 pm

Entonces prácticamente lo que hacia yo era apuntar a esa cadena? Era lo que pensaba.
Con respecto a tu duda, me decia la maestra de ética :shock: : Copiar, puesto que copear es de brindar :shock:.
Gracias por la ayuda me has salvado la vida y bastante de mi cabello...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado