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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ingresando datos unidimensionalmente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ingresando datos unidimensionalmente  (Leído 2,209 veces)
ryan parker

Desconectado Desconectado

Mensajes: 81



Ver Perfil
ingresando datos unidimensionalmente
« 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


« Última modificación: 2 Mayo 2012, 00:58 am por ryan parker » En línea

Your kung-fu is not strong!
Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: ingresando datos unidimensionalmente
« Respuesta #1 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.


En línea

exel

Desconectado Desconectado

Mensajes: 50



Ver Perfil
Re: ingresando datos unidimensionalmente
« Respuesta #2 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().
En línea

neveldine

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: ingresando datos unidimensionalmente
« Respuesta #3 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.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines