[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