C/Visual C - covertir de int * a long *

 
Vista:
Imágen de perfil de diana

covertir de int * a long *

Publicado por diana (10 intervenciones) el 23/08/2007 20:52:56
hoal, tengo una funcion a la cual le paso un long, meti una variable del tipo long para pasarla pero me aparece el siguiente fallo:
Error 1 error C2440: 'initializing' : cannot convert from 'int *' to 'long *'
la linea es:
long * chdev=&dxinfo[channum].chdev;
donde =&dxinfo[channum].chdev es un int.
q puedo usar para hacer la conversion?
Saludos y de antemano muchisimas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:covertir de int * a long *

Publicado por fernando.gomez (1603 intervenciones) el 23/08/2007 21:45:04
Pues cambiar el tipo de variables. Es decir, quizás podrías hacer algo como

long* chdev = (long*)&dxinfo[channum].chdev;

pero no es recomendable, porque puntero a long apunta al doble de memoria que el puntero a int.

Ahora, lo que puedes hacer también es:

long temp = dxinfo[channum].chdev; // conviertes de int a long
long* chdev = &temp;

eso sería mucho más seguro.

Saludos,
Fernando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:covertir de int * a long *

Publicado por Tom (619 intervenciones) el 24/08/2007 08:15:57
Haz un cast.

long * chdev= (long *)&dxinfo[channum].chdev;

Pero luego tenlo en cuenta, para saber que estás manejando int (no long).

long pepe = (long)*chdev;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:covertir de int * a long *

Publicado por fernando.gomez (1603 intervenciones) el 24/08/2007 14:27:55
Hola. Supongamos que estamos en una plataforma de 32 bits estándar, de tal suerte que sizeof(int) == 16 bits y sizeof(long)==32 bits. En este caso, un int* apunta a una dirección de memoria de 2 bytes, mientras que un long* apunta a una dirección de 4 bytes. Si tu haces un cast de int* a long*, estás haciendo la conversión de los primeros 2 bytes. Pero los segundos 2 bytes del long* apuntarán (probablemente) a un segmento de memoria inválido debido a que no ha sido inicializado. Entonces basta con que tu variable long quiera usar esos bits:

*chdev = sizeof(int)+1;

para que tengas un comportamiento indefinido. De ahí que no sea recomendable hacer lo que sugieres --inclusive, por eso no se permite el cast automático de int* a long*. No es lo mismo manejar valores que direcciones de memoria.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:covertir de int * a long *

Publicado por Tom (619 intervenciones) el 28/08/2007 09:58:25
No.

Estamos hablando de punteros a direcciones de memoria.
Los punteros siempre tienen el mismo tamaño independientemente de la dirección a la que apunten.

En realidad el tipo de dato sólo es necesario en el momento en que desreferencias la dirección (y, es el compilador quien necesita conocerlo).

Por eso, puedes utilizar los punteros indistintamente, haciendo cast en el momento necesario.

No se deben confundir las direcciones de memoria con su contenido.

#include <stdio.h>
#include <limits.h>

/* */
int main(int argc, char *argv[]) {
long vlong = LONG_MAX;
int vint;
long *plong = &vlong;
int *pint = (int*)plong;

printf("Tamaño punteros -> Int %ld , Long %ld\n", sizeof(pint), sizeof(plong));

printf("Valor long (LONG_MAX): %ld\n", vlong);
printf("Contenido del puntero a int tratado como long: %ld\n", *((long*)pint));
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Puse un mal ejemplo

Publicado por Tom (619 intervenciones) el 28/08/2007 10:02:37
Este ejemplo sería mejor:

#include <stdio.h>
#include <limits.h>

/* */
int main(int argc, char *argv[]) {
long vlong = LONG_MAX;
short vint;
long *plong = &vlong;
short *pint = (short*)plong;

printf("Tamaño punteros -> Short %ld , Long %ld\n", sizeof(pint), sizeof(plong));

printf("Valor long (LONG_MAX): %ld\n", vlong);
printf("Contenido del puntero a short tratado como long: %ld\n", *((long*)pint));
}

La salida es algo así:

Tamaño punteros -> Short 4 , Long 4
Valor long (LONG_MAX): 2147483647
Contenido del puntero a short tratado como long: 2147483647
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar