Punteros en C

Khanser

Buenas, siempre he estado por mediavida rulando por el subforo de Battlefield y nunca he sabido que existia este subforo, justamente lo descubro cuando tengo ciertas dificultades con unos punteros en C, a ver si los gurús del tema me pueden hechar un cable.

La cosa es que una funcion de mapeo de memoria (zonas de memoria compartida para acceso desde diferentes procesos) me devuelve un (void *), y yo dentro de este puntero quiero guardar el valor de puntero de un vector donde tengo varios buzones para comunicación entre procesos, porque asi no hace falta que pase 9 valores en la creación del proceso, sino que paso la zona a mapear de memoria y todo mas bonito y feliz XD

bueno pues cuando lo hago:

buzones = map_mem(ipc_buzon);
// (void *) map_mem(int ipc);

char string[20];
sprintf(string,"%p",&buzon);
// buzon --> int buzon[9]

((char)buzones) = string;

El mensajito de compilación "assignment makes integer from pointer without a cast"

La pregunta es, ¿Como se deberia castear correctamente?
Y el otro tema, cuando recupere estos datos, como almaceno estos valores en su formato original de array?

Muchas gracias, llevo con esto todo el dia y estoy quemaisimo ya >_<

maRc

Te estás haciendo la picha un lío.

sprintf(string,"%p",&buzon);
Si quieres meter la dirección donde apunta buzon, tienes que quitar el &. Un vector no es más que un puntero puesto de forma diferent.

((char)buzones) = string;
Haciendo esto pierdes la dirección que te ha devuelto map_mem.
Si quieres poner "buzon" en buzones, ¿por qué no pones "buzones" en el sprintf en lugar de "string"?

Para recuperarlo luego, pues se lo asignas a un puntero al tipo original.

Khanser

Si no te digo yo que me estoy enredando tontamente? xD

Gracias, cuando lo prueve te digo :_D

No obstante, para meter un valor alli donde apunta el puntero, era usando el * con el puntero? Cuando se cambiar el apuntador seria si asignara sin el asterisco no? :/

ethernal-

El operador * para acceder al contenido del puntero.

& para direcciones de memoria.

Si quieres cambiar donde apunta el puntero, si, es con el nombre a secas.

bLaKnI

#4, eso es la teoria.
Despues, cuando tienes una función que crea un puntero bidimensional, que se devuelve como unidireccional y que debe ser recogido en otra función para integrarlo en una tupla dinámica para finalmente devolver un int a secas, pero por referencia (todo esto es un ejemplo ficticio-sinsentido, pero es para "contrastar" esos... momentos ;) ), vale todo, menos el "pongo un * aquí y un & allá"...

Anda que no habremos visto veces el "not posible to cast *int to single int" o el "not posible to cast *int to **int" y barbaridades similares... xD

acabas haciendo cosas como:

**&polla -> &&index;

xDDD

compilas y:

Error 29: not posible to... xDDD

Cuantas horas perdidas con los punteros y que grandes nos hemo hecho... ^^

Khanser

Vale, lo del sprintf rula de puta madre, ahora al intentar recuperar este valor hago:

int buzon_sem[max_pil];

sem_buz = map_mem(buzon);

buzon_sem = (int)(sem_bus);

Y me da error, lo que, como coño convierto una cadena de caracteres a valor de puntero?

Si yo tengo por ejemplo "ffaa00" -> 0xffaa00

y no parece que exista ningun "atoh()"

maRc

¿Para qué necesitas guardarte la dirección en una cadena? ¿No te basta con pasarle el puntero?

Khanser

Ya lo encontré, es con un sscanf();

Usuarios habituales

  • Khanser
  • maRc
  • bLaKnI
  • ethernal-