Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Acceder un array por direccion

Estas en el tema de Acceder un array por direccion en el foro de C/C++ en Foros del Web. Hola a todos Estoy tratando de solucionar un problema en mi codigo, pero no he podido. Tengo una clase que se llama Red. La clase ...
  #1 (permalink)  
Antiguo 20/08/2012, 17:26
 
Fecha de Ingreso: agosto-2012
Mensajes: 30
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Acceder un array por direccion

Hola a todos

Estoy tratando de solucionar un problema en mi codigo, pero no he podido.

Tengo una clase que se llama Red.

La clase red tiene una propiedad que se llama Tag, donde guardo cualquier valor de tipo int.

Ahora, tengo un arreglo declarado de esta manera

Código C++:
Ver original
  1. Red Redes**;
  2.  
  3. Redes = (Red**)malloc(sizeof(Red*)*1024);
  4.  
  5. for (int i = 0; i < 1024; i++)
  6.    Redes[i] = new Red(...);

La cuestion es que ahora en un trozo de codigo necesito acceder a cada elemento de Redes, pero no a traves del indizador sino de la direccion. Por ello he echo esta funcion para obtener cada elemento

Código C++:
Ver original
  1. inline Red* ACCESO_INDIVIDUAL(void* buffer, int index)
  2. {
  3.     return (Red*)buffer+id;
  4. }

pero cuando la llamo y hago

Código C++:
Ver original
  1. int tag_value = (*ACCESO_INDIVIDUAL(Redes, 5)).Tag;

no obtengo el valor que deberia, sino un valor aleatorio

Entonces mi pregunta es, estoy accediendo mal, o debo de hacerlo de otra manera??

Espero me puedan colaborar, gracias
  #2 (permalink)  
Antiguo 21/08/2012, 13:20
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Acceder un array por direccion

Hola! nose mucho de C++, pero esta forma de declarar:
Código C++:
Ver original
  1. Red Redes**;
no la conocia. No deberia ser Red **Redes???
Tambien en la funcion usas "id" cuando deberia ser bufer+"index" ....

Sacando esos detalles, te marco algunas observaciones:

1º Me parece que no es conveniente mezclar funciones como malloc y new. Si estas en C++ usa new
Código C++:
Ver original
  1. Redes= new Red*[1024];

2º En la funcion vos casteas bufer+"index" a (Red *), pero bufer+index sigue siendo un puntero a puntero a Red por lo tanto el casteo esta demas, y deberias retornar Red**
Código C++:
Ver original
  1. inline Red** ACCESO_INDIVIDUAL(void* buffer, int index)
  2.     {
  3.         return (Red**)buffer+id;
  4.     }

3º Otra observacion es que no le encuentro mucho sentido declarar Redes como puntero a puntero, no es mas conveniente hacer
Código C++:
Ver original
  1. Red *Redes;
  2.      
  3.     Redes = new Red[1024];
  4.      
  5.     for (int i = 0; i < 1024; i++)
  6.        Red[i].Tag= xNumero;



Saludos
  #3 (permalink)  
Antiguo 21/08/2012, 14:18
 
Fecha de Ingreso: agosto-2012
Mensajes: 30
Antigüedad: 11 años, 8 meses
Puntos: 3
Respuesta: Acceder un array por direccion

Hola cesar_casla

Gracias por tus observaciones
Cita:
Hola! nose mucho de C++, pero esta forma de declarar:
Red Redes**;
no la conocia. No deberia ser Red **Redes???

Tambien en la funcion usas "id" cuando deberia ser bufer+"index" ....
Tienes razon, me he equivocado al copiar el codigo aqui en el foro. Tambien en lo de id e index. Lo siento.

Cita:
1º Me parece que no es conveniente mezclar funciones como malloc y new. Si estas en C++ usa new
Redes= new Red*[1024];
Esto lo hago asi, para poder llamar el constructor de cada elemento del array de manera independiente. Si trato de hacerlo, con la declaracion que tu me dices, me da unos errores.

Cita:
2º En la funcion vos casteas bufer+"index" a (Red *), pero bufer+index sigue siendo un puntero a puntero a Red por lo tanto el casteo esta demas, y deberias retornar Red**
inline Red** ACCESO_INDIVIDUAL(void* buffer, int index)
{
return (Red**)buffer+id;
}
En este caso retorno solo *, ya que es un elemento del array. El ** es para su conjunto
Cita:
3º Otra observacion es que no le encuentro mucho sentido declarar Redes como puntero a puntero, no es mas conveniente hacer

Red *Redes;

Redes = new Red[1024];

for (int i = 0; i < 1024; i++)
Red[i].Tag= xNumero;
(Puntero)(Puntero) **. Variable cuyos posibles valores son direcciones de otras variables puntero. O al menos asi lo entiendo.
Tambien he probado esta definicion que me dices, y asi no me permite llamar al constructor del objeto.


De todas formas, he probado todos los cambios que me has sugerido, y asi se me genera una serie de errores.

Muchas gracias
  #4 (permalink)  
Antiguo 21/08/2012, 16:36
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Acceder un array por direccion

Lo del constructor tiene mas sentido, ahora entiendo xq puntero a puntero. Igual subi todo el codigo asi t ayudo mejor
  #5 (permalink)  
Antiguo 22/08/2012, 08:02
 
Fecha de Ingreso: agosto-2012
Mensajes: 30
Antigüedad: 11 años, 8 meses
Puntos: 3
Respuesta: Acceder un array por direccion

Hola cesar_casla

He echo otro codigo, mas cortito, pero con el mismo planteamiento de antes.
Podes copiar todo en un solo archivo.

para compilar estoy usando el g++

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. class Network
  5. {
  6.     public:
  7.         int Tag;
  8.        
  9.         Network(int tag);
  10. };
  11.  
  12. Network::Network(int tag)
  13. {
  14.     Tag = tag;
  15. }
  16.  
  17. int main(void)
  18. {
  19.     Network** net = (Network**)malloc(sizeof(Network)*100);
  20.    
  21.     for (int i=0; i < 100; i++)
  22.         net[i] = new Network(i);
  23.                
  24.     printf ("The value of net[3]->Tag = %d\n", ((Network*)net+3).Tag);
  25.  
  26.     return 0;
  27. }

la salida del printf me da

The value of net[3]->Tag = 134521760

cuando deberia ser

The value of net[3]->Tag = 3

sigo sin enterder porque no me da el resultado esperado.

muchas gracias por tu colaboracion
  #6 (permalink)  
Antiguo 22/08/2012, 21:25
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Acceder un array por direccion

Gracias por hacer un miniprograma de tu duda y no postiar 100 lineas como hacen muchos...


Primero que nada es raro que el g++ no te haya marcado un error del codigo que pusiste(use devC++ y a mi si me marco error).
Como ya te habia dicho antes el cast que haces en:
Código C++:
Ver original
  1. (Network*)net+3).Tag
esta mal. Aclaracion:
net: es un puntero a puntero a Network
*net: es un puntero a Network
**net: es el objeto Network

Sabiendo esto si vos haces net+3 estas modificando el puntero a puntero, pero para poder acceder a Tag tenias que hacer: *(net+3) ó net[3]. Usando cualquiera de esas dos formas en ves del "." debes usar "->" ya que cada subindice del arreglo net es un puntero por lo tanto para acceder a un miembro del objeto tenes que usar -> (tema muy tratado cuando se ve estructuras).
Código C++:
Ver original
  1. (*(net+3))->Tag;
Tambien podes usar el "." pero tenes que acceder al objeto, osea
Código C++:
Ver original
  1. (**(net+3)).Tag


Basta de palabras, te dejo el codigo sin usar malloc y funcionando con 3 formas de imprimir Tag:
Código C++:
Ver original
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.      
  4.     class Network
  5.     {
  6.         public:
  7.             int Tag;
  8.            
  9.             Network(int tag);
  10.     };
  11.      
  12.     Network::Network(int tag)
  13.     {
  14.         Tag = tag;
  15.     }
  16.      
  17.     int main(void)
  18.     {
  19.         Network** net = new Network*[100];
  20.        
  21.         for (int i=0; i < 100; i++)
  22.             net[i] = new Network(i);
  23.                    
  24.         printf ("The value of net[3]->Tag = %d\n", (*(net+3))->Tag); // usando la aritmetica de punteros con "->"
  25.          printf ("The value of net[3]->Tag = %d\n", net[3]->Tag); // usando subindices con "->"
  26.         printf ("The value of net[3]->Tag = %d\n", (**(net+3)).Tag); //usando la aritmetica de punteros con "."
  27.      system("PAUSE");
  28.         return 0;
  29.     }


Saludos

PD: no es un tema facil comprender el uso de puntero a puntero sin un grafico; si encuentro algo lo subo
  #7 (permalink)  
Antiguo 23/08/2012, 16:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 30
Antigüedad: 11 años, 8 meses
Puntos: 3
Respuesta: Acceder un array por direccion

Hola cesar_casla

Muchisimas gracias por tu colaboracion.

He podido resolver la duda y el problema que tenia.

de nuevo, muchas gracias

Etiquetas: direccion, funcion, int, arreglos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:17.