[C con Clase] C++ Tema Herencia

Davidson, Steven srd4121 en njit.edu
Mie Ago 12 05:27:48 CEST 2015


Hola Joaquín,

Cada "pez" es un array de arrays de 'char' que conceptualmente es una lista
de cadenas de caracteres. Por lo tanto, el carácter nulo debe ir al final
de cada cadena de caracteres, y no al final de la lista de cadenas. Esto es,

f0 = new char*[6];

for( int i=0; i<6; i++ )
  f0[i] = new char[3];  // 2 + el carácter nulo

Y luego tenemos que asignar tal carácter nulo:

f0[0][0]=92;   f0[0][1]=47;   f0[0][2]=0;
f0[1][0]=95;   f0[1][1]=45;   f0[1][2]=0;
f0[2][0]=124; f0[2][1]=46;   f0[2][2]=0;
...

El otro problema es que asignas caracteres nulos al comienzo en algunas
cadenas; por ejemplo, escribes,

f0[4][0]=0;   f0[4][1]=39;

Esto no tiene sentido porque marcas el final de la cadena en el primer
carácter y por tanto, los posteriores caracteres no son usados, que en este
caso es el código ASCII, 39. Sospecho que quieres dejar un espacio, por lo
que haz eso mismo; por ejemplo,

f0[4][0]=' ';   f0[4][1]=39;   f0[4][2]=0;

Además, no veo ninguna razón por usar los códigos ASCII explícitamente, ya
que el código no es muy legible de esta manera. Es más fácil usar los
caracteres; por ejemplo,

f0[0][0]='\\';   f0[0][1]='/';   f0[0][2]=0;
f0[1][0]='_';   f0[1][1]='-';   f0[1][2]=0;
f0[2][0]='|';    f0[2][1]='.';   f0[2][2]=0;
...

Claro que si sabes exactamente los caracteres que quieres guardar, creo que
es más sencillo usar un array regular; por ejemplo,

char f0[6][3] = { "\\/", "_-", "|.", ... };

Así no tienes que andar con memoria dinámica ni asignando caracteres uno a
uno.


En cuanto al tema de 'delete[]', debes emparejar cada uso de 'new[]' con un
'delete[]'; es decir, cada petición de memoria debe corresponder con cada
liberación de memoria. Para 'f0', pides siete bloques diferentes de
memoria; o sea, usas 'new[]' siete veces. A la hora de liberar la memoria
debes liberar cada bloque que pediste, y por tanto, debes usar 'delete[]'
siete veces. Esto es,

Pez_Chico::~Pez_Chico()
{
  for( int i=0; i<6; i++ )  // Liberamos cada array en 'f0[i]'
    delete[] f0[i];
  delete[] f0;                // Liberamos el array de punteros, 'f0'

  // Lo mismo para 'f1'
  ...
}


Si quieres listar error por error, puedo contestar cada uno directamente; y
si no quieres, no pasa nada, ya listaré cada tema por separado.


Espero que vaya aclarando las dudas.

Steven


2015-08-11 21:50 GMT-04:00 Joaquin Copello <joaquin.lpda20 en hotmail.com>:

> Primero que nada gracias Steven. Ahora te vuelvo a adjuntar el codigo con
> las modificaciones y te paso a comentar el tema de valx se me paso ya
> corregido mejoro el movimiento perfecto. Con el tema de imprimir y los puts
> si no entendi mal lo que me queres decir es que a la hora de contruir los
> dos arrays los defino como char*[6] por ejemplo en el pez chico y le paso
> valores del 0 al 5, eso es lo que yo entendi por lo tanto lo defini como
> char*[7] para deja el ultimo espacio libre para el /0, si esto es
> incorrecto espero tu correcion. Por ultimo con el tema del delete[] no
> entendi mucho el bucle si lo utilice de la manera que vos me indicas pero
> no entendi mucho el tema. Por ahora lo que se imprime en pantalla no es lo
> correcto que deberian ser dos peces, espero tu respuesta. Y ya que estoy te
> pregunto porque me acabo de dar cuenta si queres que cualquier proximo
> mensaje te lo envie como enumerado paso por paso o error por eror de la
> forma que lo hiciste vos para que te resulte mas comodo solo mecionalo.
> Muchas gracias y saludos
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150811/4766344b/attachment.html>


Más información sobre la lista de distribución Cconclase