| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 24 Abr, 2009 5:47 pm Asunto: Pasar por referncia Vector? |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 24 Abr, 2009 7:17 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 24 Abr, 2009 9:15 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 25 Abr, 2009 1:18 am Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Sab 25 Abr, 2009 9:01 am Asunto: |
|
|
| Perfecto....Muchas gracias |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Sab 25 Abr, 2009 9:50 am Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 25 Abr, 2009 11:10 am Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Sab 25 Abr, 2009 4:32 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 25 Abr, 2009 5:44 pm Asunto: |
|
|
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 |
|
 |
|