SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: martinlopez en Jueves 12 de Abril de 2007, 13:38

Título: Asignar Direccion A Puntero
Publicado por: martinlopez en Jueves 12 de Abril de 2007, 13:38
Estoy con un programa que guarda un array de punteros con las direcciones qeu devuelve la sentencia malloc()

lo que quiero es que cuando pida por teclado una direccion de memoria, si es una de las del array la libero con free y sino no hago nada.

El problema es qeu la direccion introducida es char * y el puntero a mi entender tiene que ser de la forma 0x9999999 y no sé como convertir de cadena a dirección de memoria.

Ayuda por favor. Saludos.
Título: Re: Asignar Direccion A Puntero
Publicado por: AnioN en Jueves 12 de Abril de 2007, 14:10
una direccion de memoria en hexa es un numero, asi que supongo que con la funcion atoi tendria que funcionar.
Título: Re: Asignar Direccion A Puntero
Publicado por: Eternal Idol en Jueves 12 de Abril de 2007, 14:21
Tenes que calcular el valor entero de esa cadena, de atras hacia adelante mientras sea un numero o una letra menor a G. Cada cifra se multiplicara por 16 a la X que se incrementara cada vez que pases al caracter anterior.

Teniendo 0x345 por ejemplo harias:

5 * 16^0=5
+ 4 * 16^1=64
+ 3 * 16^2=768
-------------------
837 decimal que equivalente a 0x345. Por lo tanto esa misma tarea la tenes que hacer en tu programa y podras obtener desde el teclado la direccion que quieras liberar en hexadecimal.
Título: Re: Asignar Direccion A Puntero
Publicado por: Eternal Idol en Jueves 12 de Abril de 2007, 14:26
Cita de: "AnioN"
una direccion de memoria en hexa es un numero, asi que supongo que con la funcion atoi tendria que funcionar.
No exactamente ya que es para numeros en base 10, podes probar esto por ejemplo:

Código: Text
  1.  
  2. printf("%d\r\n", atoi("0x3BC"));
  3. printf("%d\r\n", atoi("3BC"));
  4.  
  5.  

El primero devuelve 0, podriamos pensar que con sacar el 0x funcionaria pero el segundo solo devuelve 3, no entiende las letras.
Título: Re: Asignar Direccion A Puntero
Publicado por: martinlopez en Jueves 12 de Abril de 2007, 15:23
Cita de: "Eternal Idol"
837 decimal que equivalente a 0x345. Por lo tanto esa misma tarea la tenes que hacer en tu programa y podras obtener desde el teclado la direccion que quieras liberar en hexadecimal.
Perfecto, esa es una tarea facil pero cuando tenga el 837 como asigno la dirección al puntero ya que si no estoy equivocado las direcciones empiezan por 0x y si tengo en 837 en la variable direccion como la asigno?
Gracias.
Título: Re: Asignar Direccion A Puntero
Publicado por: Eternal Idol en Jueves 12 de Abril de 2007, 16:06
Cita de: "martinlopez"
Perfecto, esa es una tarea facil pero cuando tenga el 837 como asigno la dirección al puntero ya que si no estoy equivocado las direcciones empiezan por 0x y si tengo en 837 en la variable direccion como la asigno?
Gracias.
Es una tarea facil siempre, si ves que tenes la x (de 0xABC por ejemplo) ahi mismo terminas el calculo del numero entero. Ese numero entero se corresponde exactamente con la direccion en hexadecimal entrada por teclado: son diferentes bases para expresar el mismo valor, en este caso una direccion en memoria.
Título: Re: Asignar Direccion A Puntero
Publicado por: AnioN en Jueves 12 de Abril de 2007, 16:42
pregunta, si tengo una direccion de memoria expresada en decimal y la quiero comparar con otra en hexa, no hay problema no?
Título: Re: Asignar Direccion A Puntero
Publicado por: Eternal Idol en Jueves 12 de Abril de 2007, 17:00
Cita de: "AnioN"
pregunta, si tengo una direccion de memoria expresada en decimal y la quiero comparar con otra en hexa, no hay problema no?
Si las tenes en un numero son exactamente iguales si las tenes en una cadena ASCII tenes que pasarlas a numero.