Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ryan parker en 2 Mayo 2012, 00:22 am



Título: ingresando datos unidimensionalmente
Publicado por: ryan parker en 2 Mayo 2012, 00:22 am
Holas a todos, no se si este bien de la cabeza pero estoy tratando de ingresar n datos en un arreglo; pero sin conocer el limite de comparacion, dejo mi idea que trato de correrlo. aclaro: aun no funciona pero se entendera mi idea.

Código
  1. #include<math.h>
  2.  
  3. double leer(double x[]);
  4.  
  5. int main(){
  6.    double x[]={0};
  7.  
  8.    leer(x);
  9.  
  10. }
  11.  
  12. double leer(double data[]){
  13.    int i=0;
  14.    char opc;
  15.  
  16.    do{
  17.        printf("\nAdd: ");
  18.        scanf("%lf", &data[i]);
  19.        i++;
  20.        printf("\nGoing add data (s/n): ");
  21.        scanf("%c", &opc);
  22.    }while(opc != 's' || opc!='S');
  23.  
  24.    return data[i];
  25. }

Saludos


Título: Re: ingresando datos unidimensionalmente
Publicado por: Valkyr en 2 Mayo 2012, 01:05 am
Eso que haces no es correcto, ya que estás introduciendo datos en zonas de memoria que no habías reservado. A mi se me ocurren dos alternativas:

1. Hacer uso de alguna estructura enlazada, como por ejemplo, una lista enlazada. Creas dos punteros uno que apunte al inicio de la estructura y otro que apunte al último elemento de la estructura. Cada vez que quieras añadir un nuevo elemento reservas espacio con malloc, enlazas el último elemento con este y pasas el puntero último al nuevo elemento.

2. Hacerlo con un array y cada vez que se quiera insertar un nuevo elemento crear un array auxiliar, reservar memoria para el tamaño del array anterior más 1, copiar todos los elementos del array anterior a este, y guardar el nuevo elemento en este, eliminas el espacio del anterior array y vuelves a iterar. Este método lo veo mucho más costoso computacionalmente.

Me imagino que habrán alternativas, pero ahora mismo son las dos que se me ocurren.

Espero que te sirva.

Saludos.


Título: Re: ingresando datos unidimensionalmente
Publicado por: exel en 2 Mayo 2012, 01:15 am
Hola

leer() no es el nombre adecuado para las operaciones que realiza.

Ahora bien, cuando haces leer(x) estas pasando la direccion de memoria de la variable x, por lo tanto no hay manera de saber el limite del arreglo que creaste.

Podrias colocar un printf("Cuantos valores quiere ingresar?: ") y un scanf() para almacenar la respuesta y pasarla como argumento a la funcion leer() y asi podras controlar el limite. Obviamente la cantidad no debe ser mayor a la cantidad maxima de bloques que tiene tu arreglo.

Podrias colocar la longitud de la cantidad maxima de bloques que tienes tu arreglo en leer() para controlar el limite.

Si quieres manejar arreglos con bloques arbitrarios debes aprender a manejar punteros y la funcion malloc().


Título: Re: ingresando datos unidimensionalmente
Publicado por: neveldine en 3 Mayo 2012, 16:57 pm
Lo que intentas se puede solucionar con realloc:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void leer(double **);
  6.  
  7. int main()
  8. {
  9.    double *p = NULL;
  10.    leer(&p);
  11.    free(p);
  12.  
  13.    return 0;
  14. }
  15.  
  16. void leer(double **pdata)
  17. {
  18.    int i = 1;
  19.    char opc;
  20.  
  21.    do {
  22.        printf("dato: ");
  23.        *pdata = realloc(*pdata, sizeof(double) * i);
  24.        scanf("%lf", *pdata+(i-1));
  25.        i++;
  26.        getchar();
  27.        printf("mas datos (s/n)? ");
  28.        scanf("%c", &opc);
  29.    } while (opc == 's' || opc == 'S');
  30. }
  31.  
  32.