<div dir="ltr">Hola Luis,<div class="gmail_extra"><br>2013/8/12 Luis Belmonte <span dir="ltr"><<a href="mailto:luispool1312@hotmail.com" target="_blank">luispool1312@hotmail.com</a>></span><br><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hola este es mi primer correo así que espero que todo se ajuste a las reglas, haganmelo saber de lo contrario.<br>

<br></blockquote><div><br></div><div>Bienvenido a la lista de correo-e. Bueno, Salvador se me ha adelantado, pero voy a agregar a lo que ha dicho.</div><div><br></div><div>Veamos el código fuente.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
// Crea y devuelve un array de tamaño n con sus elementos<br>
// inicializados a cero e indexados desde 1 hasta n.<br>
// Req: n>0<br>
Array ArrayCrea(int n)<br>
{<br>
      ArrayAp a=malloc(sizeof(ArrayRep));<br></blockquote><div><br></div><div>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,</div>
<div><br></div><div>ArrayAp a = (ArrayAp) malloc( sizeof(ArrayRep) );<br></div><div><br></div><div>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:<br>
<br>return *a;</div><div><br></div><div>Pero esto provoca otros problemas en cuanto a la liberación de la memoria.</div><div><br></div><div>Lo más seguro es que te interese retornar 'Array *' o posiblemente 'ArrayAp'.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
      a->n=n;<br>
      a->v=malloc(sizeof(int)*n);<br>
      for (int i=0;i<a->n;i++)<br>
          a->v[i]=0;<br></blockquote><div><br></div><div>Podrías usar la función estándar 'memset()', declarada en <string.h>. Por ejemplo,</div><div><br></div><div>memset( a->v, 0, a->n );</div><div>
<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
      return a;<br>
}<br></blockquote><div><br></div><div>En general, no se recomienda crear este prototipo. Sugiero obligar el paso del 'Array' en sí como parámetro. Esto es,</div><div><br></div><div>Array * ArrayCrea( Array **ptr, int n );</div>
<div><br></div><div>Así nos aseguramos de que el 'Array' existe y se ve claramente lo que vamos a hacer.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

// Crea y devuelve un subarray del array a comprendido<br>
// entre los índices i y j.<br>
// Req: 1<=i<=j<=ArrayTam(a)<br>
Array ArrayCreaSubarray(Array a, int i, int j)<br>
{<br>
       ArrayAp ap=a;<br>
       ArrayAp a2=ArrayCrea(j-i+1);<br></blockquote><div><br></div><div>Podríamos calcular: j-i+1, porque luego lo vamos a usar en el bucle; esto es,</div><div><br></div><div>j -= ++i;<br></div><div><br></div><div>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'.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
       for (int x=0; x<j-i+1;x++)  ap->v[i+x-1]=a2->v[x];<br></blockquote><div><br></div><div>Nuevamente, podríamos echar mano a las funciones estándares; particularmente, 'memcpy()'. Por ejemplo,</div><div>
<br></div><div><div>j -= ++i;<br></div></div><div>memcpy( a2->v, ap->v+i, j * sizeof(int) );<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

       return a2;<br></blockquote><div><br></div><div>Como antes, seguramente 'Array' y 'ArrayAp' son tipos diferentes de datos.</div><div><br></div><div><br></div><div>Espero que esto aclare un poco más el tema.</div>
<div><br></div><div>Steven</div><div><br></div></div></div></div>