A ver si puedo lograr que me entiendas. Cuando yo le estoy pidiendo al usuario que me indique dos valores, inferior y superior, el lo está haciendo en una escala de +1, para el usuario el primer índice es el 1, pero para el compilador el primer índice es el 0, como ya sabemos. Ahora si yo introduzco como parámetro en la función este índice, cuando vaya a dirigirme a él dentro de la función tendré que restarle 1 para que concuerden.
for (int x=0; x<j-i+1;x++) a2->v
ejemplo:
El usuario quiere que se cree un subarray b, a partir del array a, para ello introduce los índices 2 y 4 (para el compilador serían 1 y 3), estos son los argumentos i y j de la función.
j-i+1=3
a[0]=3; a[1]=6; a[2]=1; a[3]=9; a[4]=2; a[5]=0;
Ahora el recorrido:
x=0; a2->v[0]=a->v[2+0-1=1]; ------>a2->v[0]=6;
x=1; a2->v[1]=a->v[2+1-1=2];------->a2->v[1]=1;
x=2; a2->v[2]=a->v[2+2-1=3];------->02->v[2]=9;
Fin de recorrido porque no se cumple la condición (x<3).
Esta mañana he comprobado que el error raíz, está relacionado con otra función que carga el array desde un fichero. Ya que el resultado es correcto al crear el array desde la siguiente función que crea el array aleatoriamente.
Array ArrayCreaAleatorio(int linf, int lsup)
{
ArrayAp a=malloc(sizeof(ArrayRep));
a->n=lsup-linf+1;
a->v=malloc(sizeof(int)*a->n);
for (int i=0; i<a->n;i++)
a->v[i]=linf+i;
for (int j=0;j<=a->n-2;j++)
{
int k=EnteroAleatorio(j+1,a->n-1);
int aux=a->v[j];
a->v[j]=a->v[k];
a->v[k]=aux;
}
return a;
}
Pero al crear el array desde un fichero si llamo a subarray con el array cargado en una variable, lo único que hace es imprimir los i-j+1 primer elementos.
Aquí la función problemática:
// Crea y devuelve un array cuyos elementos han sido
// leídos desde un fichero de texto con descriptor de fichero f.
// Req: El formato del fichero de lectura es el siguiente:
// n v_1 v_2 ... v_n
// con n>0.
// Por ejemplo, el array {4,6,3,5} estaría en el fichero como:
// 4 4 6 3 5
Array ArrayCreaFichero(FILE * f)
{
ArrayAp a;
fscanf(f,"%d",&a->n);
a->v=malloc(sizeof(int)*a->n);
for(int i=0;i<a->n;i++)
fscanf(f,"%d",&a->v[i]);
return a;
}
Y he comprobado que el error no se encuentra en el primer elemento del array(el que representa a n). Al imprimir por pantalla un array creado desde esta función devuelve lo esperado, en el caso del ejemplo: 4 6 3 5