![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
¿ copia por valor de Matriz dinamica como lo hago?
Buenas
He creado una Martriz dinamica de la forma Código:
TClassPadre { Public:: char Dat[10]; typedef struct {char ** Dat;}TMatriz; TMatriz Matriz; } Código:
ClassHija { TMatriz::TClassPadre Matz1 TMatriz::TClassPadre Matz2 } Código:
ClassHija::AsigDatos { Matz1.Dat=(char **)malloc(sizeof(char *)*NumDatos+1); for(int i=1;i<NumDatos+1;i++) { Matz1.Signo[i]=(char*)malloc(sizeof(char)*10; for(int b=1;b<10;b++) { Matz.Dato[i][b] = 'x' } } } Código:
ClassHija::DUDA { Matz2 = Matz1; } Mi pregunta es: Como puedo Hacer que Mtz2 se inicialice con los datos de Mtz1 y al modificar sus datos (Matriz Auxiliar) no afecte a los datos de Mtz1. Si no es posible hay alguna otra forma... Gracias |
#2
|
|||
|
|||
Hola,
tal como dices, estas asignando punteros, por lo que las dos variables (matz2 y matz1) en realidad comparten las mismas posiciones de memoria, y son en esencia la misma variable que la representan dos simbolos diferentes. Para copiar los datos, tendrias que usar las funciones de C para copiar, copiando asi los datos de unas posiciones de memoria en otras. Creo que era strcpy la funcion correcta para estas cosas. Espero que te sirva, un saludo. |
#3
|
|||
|
|||
Gracias por contestar...
La utilizacion de strcpy es una opcion pero creo que la copia se realizaria caracter a caracter rrecorriendo toda la matriz, que para matrices de gran tamaño (millones) requiere un poco de tiempo. Desta forma tengo la opcion tambien Código:
typedef char TMatriz[15][15]; TMatriz Matz1 = new TMatriz; TMatriz Matz2 = new TMatriz; Matz2[x][y] = (*Matz1) [x][y] Gracias otra vez |
#4
|
|||
|
|||
hola, sigo pensando que te confundes, la mejor solución es usar strcpy en tu funcion de assign (lo que llamas "copia real"), ya que es la funcion estandar de C para copiar grandes bloques de memoria, y esta mas que optimizada desde hace mucho tiempo, aunque hay otras funciones en librerias especializadas. De todas maneras, sí es mas entendible copiar caracter por caracter en un bucle for. Dejo este post unicamente por si se relee, para que no hayan confusiones. Un saludo.
Última edición por coso fecha: 07-11-2010 a las 11:44:22. |
#5
|
||||
|
||||
En realidad los dos hacéis referencia a dos cosas importantes.
1.- La implementación de un constructor copia y la sobrecarga del operador "=" permiten realizar cosas como esta: Código:
TMatriz Matz1; TMatriz Matz2; Matz2 = Matz1; TMatriz Matz3(Matz1); No es necesario crearlas con punteros como se exige en el caso de trabajar con la VCL. 2.- El código usado en el constructor copia o la sobrecarga del operador "=" debe realizar una copia real a nivel de memoria de una matriz en la otra. Bien con strcpy, memcpy o la API CopyMemory. Para el caso de strcpy decir que sólo es válido para cadenas estilo C (terminadas en nulo) pues encontrado el nulo termina la copia que es carácter a carácter. Saludos. |
#6
|
|||
|
|||
Buenas... Teniendo encuenta lo dicho anteriormente he implemetado una clase Matriz de la forma
Código:
class TMatriz { private: **Matriz; public: TMatriz(int Nfilas,int NColumnas); // Constructor TMatriz (const TMatriz &m); //Constructor de Copia const TMatriz &m operator = (const TMatriz &m) //Sobrecarga asignacion = } Tmatriz::Tmatriz(int Nfilas, Int NColumnas) { Matriz = new char *[NColumnas] for (int i=0;i<NColumnas;i++) { Matriz[i] = new char [Numfilas]; } } He intentado implementar la funcion constructor de copia (reservando memoria con memcpy) y la funcion sobrecarga asignacion y no lo consigo...me podeis ayudar Gracias |
#7
|
||||
|
||||
Básicamente la cosa sería algo así:
Código:
class TMatriz { private: char **Matriz; int Filas; int Columnas; public: TMatriz(); TMatriz(int Nfilas, int NColumnas); // Constructor TMatriz (const TMatriz&); //Constructor de Copia TMatriz &operator=(const TMatriz&); }; // Constructor por defecto TMatriz::TMatriz(): Filas(0), Columnas(0), Matriz(0) { } TMatriz::TMatriz(int Nfilas, int NColumnas): Filas(Nfilas), Columnas(NColumnas), Matriz(0) { Matriz = new char *[NColumnas]; for(int i=0; i<NColumnas; i++) Matriz[i] = new char [Nfilas]; } // Constructor copia TMatriz::TMatriz(const TMatriz& E): Filas(0), Columnas(0), Matriz(0) { *this = E; } // Sobrecarga del operador asignación TMatriz& TMatriz::operator=(const TMatriz &E) { // Libero mamoria if(Matriz){ for(int i=0; i<Columnas; i++) delete [] Matriz[i]; delete [] Matriz; } // Copio la Matriz Columnas = E.Columnas; Filas = E.Filas; Matriz = new char *[Columnas]; for(int i=0; i<Columnas; i++){ Matriz[i] = new char [Filas]; CopyMemory(Matriz[i], E.Matriz[i], Filas); } return *this; } Código:
TMatriz Mt1(10,10); TMatriz Mt2(Mt1); // Con el constructor copia TMatriz Mt3 = Mt1; // Asignando Saludos. |
#8
|
||||
|
||||
No te olvides de implementar un destructor.
![]() Saludos. |
#9
|
|||
|
|||
Muchisimas Gracias........ eres un Crack.
Tendre que seguir trabajando con el tema de los punteros, no acabo de entenderlos del todo Gracias otra vez |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Matriz dinamica | BC++ | C++ Builder | 7 | 24-10-2011 19:04:29 |
Copia de tablas como copia de seguridad | Mathom | Varios | 4 | 04-01-2006 09:19:57 |
matriz dinámica de string | triniti | OOP | 4 | 20-07-2004 13:31:52 |
como hago q un TDBLookupComboBox tenga un valor seleccionado por defecto | aram2r | Conexión con bases de datos | 1 | 03-06-2004 11:36:26 |
Como hago referencia al valor de una celda de un DBGrid? | Sóstrato | OOP | 3 | 12-06-2003 00:32:06 |
![]() |
|