En primer lugar, si puede corregir func
(puede modificar su fuente), luego soluciónelo. Si sus cálculos se pueden hacer con punteros, hágalo con punteros y punteros de retorno. A veces, existen razones válidas para trabajar con direcciones como enteros (por ejemplo, tratar problemas de alineación en un código especial). En ese caso, cambie func
para usar el tipo uintptr_t
(definido en stdint.h
). Está diseñado para tratar punteros como enteros cuando sea necesario. (También hay intptr_t
si la aritmética firmada es mejor por algún motivo, pero generalmente considero que el uintptr_t
sin signo es menos problemático.) Preferiblemente, func
debe convertir el uintptr_t
en un puntero al devolverlo, por lo que el tipo de devolución de func
sería un puntero (a algo, tal vez some_struct
o void
).
Si no puede reparar func
, puede usar moldes para decirle al compilador que tiene la intención de realizar las conversiones que se están realizando. Sin embargo, este mensaje de error particular le indica que no está simplemente convirtiendo un entero en un puntero, sino que está convirtiendo un entero de un tamaño (por ejemplo, cuatro bytes) en un puntero de otro tamaño (por ejemplo, ocho bytes). Es probable que este código se haya escrito originalmente para un sistema donde el tipo entero devuelto por func
tenía el mismo tamaño que el tipo de puntero, pero ahora se está compilando en un sistema donde el tipo de puntero es mayor o menor que ese entero.
En ese caso, debe asegurarse de que el cálculo realizado por func
funciona en la nueva arquitectura. Si solo devuelve un valor de 32 bits, ¿siempre tendrá el valor correcto? Es decir, ¿nada se perderá por la falta de 32 bits altos? ¿Ninguna dirección que el func
debe calcular excede nunca el valor máximo del tipo entero que utiliza? Si func
usa tipos de entero con signo, considere también el bit de signo.
Si se ha asegurado de que el valor devuelto por func
es correcto, puede usar moldes explícitos, como por ejemplo: some_struct *ptr = (some_struct *) (intptr_t) func();
.
¿Por qué le gustaría colocar un entero en un puntero de estructura? – Jay
Es posible, pero los casos en que esa es la forma correcta de hacerlo son raros. –
¿hay sobrecarga de las diferencias de "salida"? (No los parámetros de entrada) –