Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Pasar por referncia Vector?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Pasar por referncia Vector? Responder citando

Buenas...

He declarado un vector booleano como tipo en una Clase 1
Código:

 TClase1
 {

     typedef  bool Tipovector[3];   

     ..........................

  }



Tengo otra CLase2 que usa el Vector antes declarado y lo Envia como parametro por referencia en un procedimiento de otra Clase3


Código:
include "Clase1.h"

TClase 2
{
   TClase1::Tipovector VectorPadre;

   ProcedEnClase(*VectorPadre);

   ................................................ 
 
}



Código:
include "Clase1.h"

TClase 3
{

   TClase1::Tipovector *ModificaVector;

   ProcedEnClase(TClase1::Tipovector &Vect);
   {

       ModificaVector=&Vect;     
       

   }
   ................................................ 
 
}



Quiero que el Vector pasado por referencia sea modificado(vectorModificado) en la Clase3 y al volver a la Clase2 el vectorPadre contenga esas modificaciones yo no doy...Gracias



}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Piensa que un array no es otra cosa que un puntero al primer elemento de dicho array. Por lo tanto piensa en punteros.

Tienes dos formas de solucionar tu problema, o pasas el puntero por referencia, o pasas un puntero a un puntero. Mira este ejemplo:

Código:

// Pasar puntero por referencia
CambiaI(int* &i)
{
  // Trabajo con los datos.....
  // Aquí trabajamos como si estuviésemos en la función que nos llama
  // Tranquilamente podemos utilizar indices i[0]=1
  *i = 0; // o Tambien  i[0]=1;
}

// Pasar un puntero a un puntero: Paso por puntero.
CambiaI1(int** i)
{
   // Trabajo con los datos.....
   **i = 1; // Esto parece un poco mas incómodo.

}

//Paso por puntero y 2...
// Haciendolo más cómodo
CambiaI2(int** pi)
{
   // Trabajo con los datos.....
   int *i = *pi;
   *i = 2; // Esto es mas cómodo.
   // o tambien
   i[0] = 2;
}


// Prueba de las anteriores funciones
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int i = 123;
   int* pI = &i;

   CambiaI(pI);   // Por referencia
   CambiaI1(&pI); // Por puntero
   CambiaI2(&pI); // Por puntero
}


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por Contestar

He probado pero sigue sin funcionar

Código:

 TClase1
 {

     typedef  bool Tipovector[3];   

     ..........................

  }




Código:
include "Clase1.h"

TClase 2
{
   TClase1::Tipovector VectorPadre;

   VectorPadre[0]=false;
   VectorPadre[1]=false;
   VectorPadre[2]=false;

 
   TClase1::Tipovector *Vect;

   Vect = &VectorPadre;

   ProcedEnClase3(Vect);

   ................................................
 
}



Código:
include "Clase1.h"

TClase 3
{

   TClase1::Tipovector *ModificaVector;

   ProcedEnClase3(TClase1::Tipovector* &Vect);
   {

       ModificaVector= Vect;   
   }
   ................................................
 
   OtroProc()
  {
      (*ModificaVector)[0]=true;
      (*ModificaVector)[1]=true;
      (*ModificaVector)[2]=true;
  }

}



Al volver a Calase 2 no reconoce los cambios
La verdad es que estoy hecho un lio.....
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Veo que te decantas por el paso por referencia. Bien, es cómodo.

Como defines el tipo Tipovector que es un array de tres bools, cometes un error al reconsiderarlo despues como un puntero a ese tipo.
Tipovector* es un puntero a un array de tres elementos bool , osea bool**, cuando en realidad lo que quuieres es que sea un simple puntero a bool (bool*)

Mira la forma correcta:

Código:

 TClase1
 {

     typedef  bool Tipovector[3];   

     ..........................

  }




Código:
include "Clase1.h"
include "Clase3.h"

TClase 2
{
   TClase1::Tipovector VectorPadre;

   VectorPadre[0]=false;
   VectorPadre[1]=false;
   VectorPadre[2]=false;

   ProcedEnClase3(Vect);

   ................................................
 
}



Código:
include "Clase1.h"

TClase 3
{

   TClase1::Tipovector *ModificaVector;
 
   // Tipovector es en realidad bool* con lo que la función espera un bool* &Vect, que es lo que quieres.
   ProcedEnClase3(TClase1::Tipovector &Vect);
   {
       Vect[0] = true;
       Vect[1] = true;
       Vect[2] = true;
   }
 
}


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perfecto....Muchas gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdona pero tengo otra duda (tu codigo funciona perfectamente).....

El vector pasa a la Clase3 perfectamente y si lo modifico en el procedimiento que lo recibe como parametro me lo modifica una ez vuelvo a la clase2...El problema surge cuando lo modifico en otro procedimiento de la Clase3 Obiamente me da error por que Es una variable Local (Parametro de un procedimiento) para solucionarlo creo una variable Goblal con las que pueda trabajar en el resto de los metodos..

Código:
TClase1::Tipovector *ModificaVector;


El problema surge cuando quiero que esta variable global Apunte a al VectorPadre lo he intentado de la siguiente manera

Código:
   ModificaVector = Vect;
   ModificaVector = &Vect;



Me da Error

Gracias Otra Vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No se cual es tu objetivo ni porqué estructuras de esa manera tu código.

neg1414 escribió:
El problema surge cuando lo modifico en otro procedimiento de la Clase3 Obiamente me da error por que Es una variable Local (Parametro de un procedimiento) para solucionarlo creo una variable Goblal con las que pueda trabajar en el resto de los metodos...

- Otro procedimiento de la clase3 puede funcionar como el primero.
- Clase3 puede conocer el VectorPadre de la clase2, hazlo público... o declara las clases amigas.
- VectorPadre puede ser desde el principoio tu variable global.

Para declarar una variable global que sea una referencia, debes inicializarla en ese momento, con lo que no te sirve mucho:
Código:

Clase1::Tipovector &VectorGlobal = Clase2.VectorPadre;

Eso sólo funciona si ya se creo Clase2.

Otra forma es que la variable global sea un puntero i la inicialización la haces en Clase2 al crearla o en algún momento:

Código:

Clase1::Tipovector *VectorGlobal = 0;
// Inicializado a 0 para saber luago si le asignaste algo o no.
.
.
.
// En el Constructor, por ejemplo
Clase2::Clase2(...)
{
   VectorPadre[0]=false;
   VectorPadre[1]=false;
   VectorPadre[2]=false;
   
    ...................
   
   VectorGlobal = &VectorPadre;
}


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por Contestar....

Al final lo He Hecho de la siguiente manera

Código:
 Clase1
 {
    bool VectorPadre[3]
 
    ProcedEnClase2(VectorPadre);

 }


Código:
 Clase2
 {
   
    //Declaro Variable Global

    bool*  VectorPuntero[3]
   ......................................

   ProcedEnClase2(bool Vect[])
     {
         *VectorPuntero = &Vect[0];
     }



Sea donde sea en la Clase2 si asigno datos a la matriz VectorPuntero
de la forma:
Código:

     (*VectorPuntero)[0]=true;


Estas Modificaciones se veran relflejadas en VectorPadre de la clase1
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bien, las formas pueden ser muchísimas según cada necesidad y momento. Un detalle:
Código:
 
ProcedEnClase2(bool Vect[])
{
    *VectorPuntero = &Vect[0];
}


Es lo mismo que:
Código:
ProcedEnClase2(bool *Vect)
{
    *VectorPuntero = Vect;
}


Se entiende mejor y es mas eficiente.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.