[C con Clase] Ayuda para crear subarray

Davidson, Steven srd4121 en njit.edu
Lun Ago 12 17:37:49 CEST 2013


Hola Luis,

2013/8/12 Luis Belmonte <luispool1312 en hotmail.com>

> Hola este es mi primer correo así que espero que todo se ajuste a las
> reglas, haganmelo saber de lo contrario.
>
>
Bienvenido a la lista de correo-e. Bueno, Salvador se me ha adelantado,
pero voy a agregar a lo que ha dicho.

Veamos el código fuente.


> // Crea y devuelve un array de tamaño n con sus elementos
> // inicializados a cero e indexados desde 1 hasta n.
> // Req: n>0
> Array ArrayCrea(int n)
> {
>       ArrayAp a=malloc(sizeof(ArrayRep));
>

Esto me desconcierta. Tenemos tres tipos de datos: Array, ArrayAp, y
ArrayRep. En principio, pensé que 'ArrayAp' era un puntero a 'ArrayRep',
por lo que deberías escribir un "cásting" (cambio de tipo) al puntero
retornado por 'malloc()'. Esto es,

ArrayAp a = (ArrayAp) malloc( sizeof(ArrayRep) );

Sin embargo, luego retornas 'a' que según el prototipo de 'ArrayCrea()' es
de tipo 'Array'. Por lo tanto, 'ArrayAp' debe tener alguna asociación a
'Array'. Sospecho que querías hacer esto:

return *a;

Pero esto provoca otros problemas en cuanto a la liberación de la memoria.

Lo más seguro es que te interese retornar 'Array *' o posiblemente
'ArrayAp'.

      a->n=n;
>       a->v=malloc(sizeof(int)*n);
>       for (int i=0;i<a->n;i++)
>           a->v[i]=0;
>

Podrías usar la función estándar 'memset()', declarada en <string.h>. Por
ejemplo,

memset( a->v, 0, a->n );

      return a;
> }
>

En general, no se recomienda crear este prototipo. Sugiero obligar el paso
del 'Array' en sí como parámetro. Esto es,

Array * ArrayCrea( Array **ptr, int n );

Así nos aseguramos de que el 'Array' existe y se ve claramente lo que vamos
a hacer.

// Crea y devuelve un subarray del array a comprendido
> // entre los índices i y j.
> // Req: 1<=i<=j<=ArrayTam(a)
> Array ArrayCreaSubarray(Array a, int i, int j)
> {
>        ArrayAp ap=a;
>        ArrayAp a2=ArrayCrea(j-i+1);
>

Podríamos calcular: j-i+1, porque luego lo vamos a usar en el bucle; esto
es,

j -= ++i;

Reusamos 'j', porque no la usamos para otra cosa en el algoritmo. También
hacemos lo mismo con 'i', ya que nos interesa 'i+1'.

       for (int x=0; x<j-i+1;x++)  ap->v[i+x-1]=a2->v[x];
>

Nuevamente, podríamos echar mano a las funciones estándares;
particularmente, 'memcpy()'. Por ejemplo,

j -= ++i;
memcpy( a2->v, ap->v+i, j * sizeof(int) );

       return a2;
>

Como antes, seguramente 'Array' y 'ArrayAp' son tipos diferentes de datos.


Espero que esto aclare un poco más el tema.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130812/6bb069eb/attachment.html>


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