elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con índices
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con índices  (Leído 4,338 veces)
shulneos

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Problema con índices
« en: 11 Agosto 2013, 22:49 pm »

Hola amigos, estoy teniendo un problema al definir una función, este es el codigo:
Código:
typedef struct {int *v; int n;}ArrayRep;
typedef ArrayRep *ArrayAp;

// 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);
       for (int x=0; x<j-i+1;x++)   a2->v[x]=ap->v[i+x-1];
       return a2;
}
El problema es que no crea el subarray desde el índice i al indice j sino que genera un array con los primeros i-j+1 elementos.
Por ejemplo:
Si el array a fuese: 1 2 3 4 5 6.
Los enteros i y j fuesen: 2 y 4.
El array correcto sería:2 3 4 sin embargo se crea el 1 2 3.

Espero que alguien me pueda ayudar.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con índices
« Respuesta #1 en: 11 Agosto 2013, 23:02 pm »

se te ha olvidado indicar la función problematica... ArrayCrea.

De todas formas, si necesitas crear un array con valores de X a Y, siendo ambos variables, necesitas pasar dos argumentos a la función:

* bien los valores de inicio y de fin
* bien el valor de inicio y la longitud de la secuencia.

Si solo pasas un valor como mucho podrás alcanzar a crear una secuencia de 0 a N o algo así.

la línea en cuestión debería quedar tal que:
Código
  1. ArrayAp a2=ArrayCrea(i, j);

No te puedo ayudar con la función porque, como te he comentado, se te ha olvidado ponerla.


En línea

shulneos

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con índices
« Respuesta #2 en: 11 Agosto 2013, 23:23 pm »

Lo siento, se me olvidó, aquí te la pongo.
Código:
// 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));
      a->n=n;
      a->v=malloc(sizeof(int)*n);
      for (int i=0;i<a->n;i++)
          a->v[i]=0;
      return a;     
}
Por eso solo tiene un argumento.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con índices
« Respuesta #3 en: 11 Agosto 2013, 23:38 pm »

Vale, perdona cosas de lo tarde que es jejeje.

El problema lo tienes aqui:

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

el código correcto debería ser:

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

Si te das cuenta, x empieza en cero, luego el primer elemento a copiar i+x = 0+x = x.

Si le restas 1 y, por ejemplo, x fuese 0, entonces tendrías i+x-1 = 0+0-1 = -1 ... te saldrías del array.
En línea

shulneos

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con índices
« Respuesta #4 en: 12 Agosto 2013, 00:07 am »

No, eso no es, si te das cuenta el array a está indexado desde 1 hasta n, así que para el usuario sería el indice i y para el compilador seria i-1 ya que en C se empieza a indexar por el 0.

Yo tb llegué a liarme mucho con esto, la profesora nos amarga la vida  :-( :-(


De todos modos lo probé y sigue pasando lo mismo.
« Última modificación: 12 Agosto 2013, 00:13 am por shulneos » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con índices
« Respuesta #5 en: 12 Agosto 2013, 22:44 pm »

A ver, efectivamente, en programación los índices empiezan por cero... por tanto el primer elemento accesible de un vector es el 0.

Esto quiere decir que tu vector va a tener la siguientes valores en los siguientes índices:

Indice: 0  1  2  3  4  5 ...
Valor:  1  2  3  4  5  6 ...

Y, como tu comentas, tanto i como j son índices ( van de 0 a n ) ...

Si tu pones:

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

para i=0, x=0 tienes aw->v[0]=ap->v[0+0-1]. Estás intentando acceder a la posición -1 de ap->v.

Ese -1 te sobra, en serio.
En línea

shulneos

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con índices
« Respuesta #6 en: 13 Agosto 2013, 18:46 pm »

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
  • =ap->v[i+x-1];

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.
Código:
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:

Código:
// 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


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con índices
« Respuesta #7 en: 15 Agosto 2013, 00:05 am »

Si no son índices no los llames como tales, nos ahorramos malentendidos :)

El problema es que no crea el subarray desde el índice i al indice j sino que genera un array con los primeros i-j+1 elementos.

¿Puede ser que tu fallo esté relacionado con lo siguiente?

Código
  1. Array ArrayCreaAleatorio(int linf, int lsup)
  2. {
  3.      ArrayAp a=malloc(sizeof(ArrayRep));
  4.      // ...
  5.      return a;
  6. }

Código
  1. Array ArrayCreaFichero(FILE * f)
  2. {
  3.      ArrayAp a;
  4.      // ...
  5.      return a;
  6. }

Lo extraño es que no te salten errores de segmentación al usar memoria no inicializada.
En línea

shulneos

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con índices
« Respuesta #8 en: 16 Agosto 2013, 12:44 pm »

Te refieres a que debería haber inicializado también en la función de ArrayCreaFichero??
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con índices
« Respuesta #9 en: 19 Agosto 2013, 11:57 am »

Te refieres a que debería haber inicializado también en la función de ArrayCreaFichero??

Si ArrayAp es un puntero tienes que reservar memoria antes de utilizarlo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con indices en base de datos « 1 2 3 4 »
Bases de Datos
Skeletron 32 18,033 Último mensaje 11 Noviembre 2009, 14:24 pm
por ^Tifa^
Diferentes tipos de INDICES?
Bases de Datos
Skeletron 2 7,851 Último mensaje 17 Febrero 2010, 18:04 pm
por Skeletron
Consulta sobre indices compuesto
Bases de Datos
Skeletron 4 5,980 Último mensaje 23 Marzo 2010, 18:32 pm
por Skeletron
Porblema indices MYSQL en tabla « 1 2 »
Bases de Datos
Riki_89D 10 6,541 Último mensaje 3 Diciembre 2010, 19:21 pm
por Riki_89D
Problema con extraer indices Array a variables
PHP
dgkrst 1 1,942 Último mensaje 10 Julio 2018, 19:42 pm
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines