Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-12-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.025
Poder: 27
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Estás mezclando C y C++. Recuerda que son lenguajes diferentes.

Lo siguiente:
Código:
//Obtengo memoria para los elementos necesarios
rutas = new(nothrow) AnsiString*[nSeleccionadas];
Sí, estás obteniendo "memoria para los elementos necesarios", pero estás creando nSeleccionadas referencias a objetos de clase AnsiString, que se almacenan en una lista (array) referenciada por el puntero rutas. Ojo, porque no estás creando ningún objeto.

Por eso lo siguiente:
Código:
//Limpio todo lo necesario
memset(rutas, 0, sizeof(rutas));
no limpia nada. Lo que hace es asignar el valor 0 a los primeras 8 octetos (asumiendo 64bit) de la lista referenciada por rutas, independientemente del tamaño de la misma.

memset no sabe de objetos, sólo sabe de posiciones de memoria. Y sizeof devuelve el tamaño del tipo, no el número de elementos de una lista (salvo que lo hayan cambiado en la definición del lenguaje C++ 99 o posterior, que si es así me parece una cagada monumental...). Estas dos funciones son funciones C, no C++.

Para limpiar los objetos has de usar un bucle y limpiar cada objeto, uno a uno, de la forma apropiada, similar a tu código de liberación de memoria:
Código:
int Ndx;

  for (Ndx = 0; Ndx < nSeleccionadas; Ndx++)
    *(rutas[Ndx]) = ""; // La clase AnsiString sobrecarga el operador "=".
Nota: Hace años que no programo C++, y de hecho me mosquea lo de "new(nothrow)", pero creo que no he cometido ningún error. Aun así, si alguien lo tiene más fresco, que lo diga.

Última edición por Ñuño Martínez fecha: 16-12-2014 a las 15:40:25. Razón: Parece que tengo el C++ más oxidado de lo que pensaba.
Responder Con Cita
  #2  
Antiguo 16-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Ñuño Martínez Ver Mensaje
...
Nota: Hace años que no programo C++, y de hecho me mosquea lo de "new(nothrow)", pero creo que no he cometido ningún error. Aun así, si alguien lo tiene más fresco, que lo diga.
No, tampoco creo que hayas cometido algún error, de allí la pregunta de mi mensaje anterior . Por que según la declaración de la variable rutas, yo habría echo algo parecido a:
Código PHP:
{
  
AnsiString **rutas;

  
// asignar memoria
  
rutas = new AnsiString*[MAXROWS];
  for(
int r 0MAXROWSr++)
    
rutas[r] = new AnsiString[MAXCOLS];

  
// cargar algunos datos
  
for(int r 0MAXROWSr++)
    for (
int c 0MAXCOLSc++) rutas[r][c] = "Rta"+IntToStr(r+c)+" ";

  
// mostrar
  
for(int r 0MAXROWSr++) {
    
"";
    for (
int c 0MAXCOLSc++) += rutas[r][c];
    
ListBox1->Items->Add(s);
  }

  
// liberar memoria
  
for(int c 0MAXROWSc++) delete [] rutas[c];
  
delete [] rutas;

(La constante nothrow, hace que que la función no lance una excepción sino que devuelva un apuntador nulo)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 16-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
a ver si me se explicar. Ya se que no estoy creando ningun objeto, lo que quiero limpiar es la lista de punteros, justo despues los creo y el poner todos a 0 antes es para luego al liberar la memoria con un condicional compruebo si es o no 0 y solo libero los que no sean 0. En teoria no es necesario ya que "new (nothrow)" devuelve 0 si falla con lo que ya estaria a 0. En el caso del array de AnsiString tambien podria utilizar un TListString pero no se que seria mejor ya que lo uso para almacenar las rutas de unas imagenes para luego poder borrarlas al terminar. No se si un array como el que hago es mas eficiente o no que un TListString ni se como se usa el TListString.
Responder Con Cita
  #4  
Antiguo 16-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
solo necesito una lista de AnsiStrings, no necesito mas dimensiones.
Responder Con Cita
  #5  
Antiguo 16-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
en realidad todos son listas, unos de objetos, otros de strings. Supongo que para las strings podria utilizar TStringList y para el resto TList pero no se usarlos ni como gestionar cuando deuna excepcion por falta de memoria. Supongo que seria "try[ lista->Add("ruta"); ]catch(...)[ //mensaje de error ]". Perdonen por todo pero es que en el movil no me deja ni poner corchetes, ni saltos de lineas ni nada. Para un TList ¿Como seria? ¿Como creo cada objeto y como lo destruyo y libero memoria en ambos casos?
Responder Con Cita
  #6  
Antiguo 16-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Si deseas trabajar con un array dinámico de elementos tipo AnsiString la declaración,
Código PHP:
AnsiString **rutas 0
es incorrecta, estas declarando una matriz de elementos tipo AnsiString, la declaración debería ser:
Código PHP:
  AnsiString *rutas
De todos modos creo que tal vez usando TStrings te resulte mas simple... Un ejemplo (sin mucho ornamento):
Código PHP:
TStrings *ts;

// Crear lista
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
ts = new TStringList;
}

// Cargar texto y grafico en TStrings
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for(
int i 0ImageList1->Counti++) {
    
Graphics::TBitmapbm = new Graphics::TBitmap;
    
ImageList1->GetBitmap(ibm); 
        
ts->AddObject(IntToStr(i),   // cadena
                     
(TObject*)bm);  // imágen
  
}
  
ListBox1->Items->Assign(ts);
}

// Mostrar en un ListBox
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Controlint Index,
      
TRect &RectTOwnerDrawState State)
{
  
TListBox *lb static_cast<TListBox*>(Control);
  
Graphics::TBitmap *bm static_cast<Graphics::TBitmap*>(lb->Items->Objects[Index]);

  
lb->Canvas->FillRect(Rect);
  
lb->Canvas->Draw(Rect.left,Rect.topbm);  // mostrar bitmap
  
lb->Canvas->TextOut(Rect.left+bm->Width+10// mostrar cadena
    
Rect.toplb->Items->Strings[Index]);
}

// Liberar memoria
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  
delete ts;

(En el ejemplo los gráficos son extraidos de un TImageList)

Resultado:



Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-12-2014 a las 17:36:37.
Responder Con Cita
  #7  
Antiguo 16-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
en tu codigo veo cosas que no entiendo. Por ejemplo, creas un puntero de tipo TStrings y luego le asignas un TStringList ¿Por que no creas un simple AnsiString y luego haces un Add con el TStringList? Por cierto, si creo AnsiString *rutas, cuando quiera guardar una ruta supongo que seria rutas[i] pero ¿Y si quiero por ejemplo leer un caracter de una ruta en concreto? ¿Seria rutas[i][j]?
Responder Con Cita
  #8  
Antiguo 16-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.
Cita:
Empezado por aguml Ver Mensaje
en tu codigo veo cosas que no entiendo. Por ejemplo, creas un puntero de tipo TStrings y luego le asignas un TStringList..
La explicación es polimorfismo.


Cita:
Empezado por aguml Ver Mensaje
¿Por que no creas un simple AnsiString y luego haces un Add con el TStringList?
Quise ponerte un ejemplo mas completo para mostrar el potencial de la clase, pero podría haber sido:
Código PHP:
{
  
TStrings *rutas = new TStringList;

  for(
int i 015i++) rutas->Add("Ruta "+String(i));
  
ListBox1->Items->Assign(rutas);

  
delete rutas;


Cita:
Empezado por aguml Ver Mensaje
cuando quiera guardar una ruta supongo que seria rutas[i] pero ¿Y si quiero por ejemplo leer un caracter de una ruta en concreto? ¿Seria rutas[i][j]?
No, sería:
Código PHP:
  rutas->Strings[i][j]; 
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-12-2014 a las 23:53:45.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda con inicialización de variables lucasarts_18 Varios 13 04-11-2010 17:12:56
Duda sobre destrucción de objetos compuestos por otros objetos noob OOP 11 16-02-2009 00:28:33
Recorrido por objetos en forma de array. vpepen Varios 7 23-01-2009 13:11:12
Array de objetos propios? gandalf_uy OOP 6 26-02-2008 04:19:48
Array de OBJETOS en Delphi 7 animal OOP 5 08-07-2005 11:33:21


La franja horaria es GMT +2. Ahora son las 08:29:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi