Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión

 
Búsqueda Avanzada

15.707 Mensajes en 3.130 Temas- por 371 Usuarios - Último usuario: lasfirrot
Mayo 18, 2012, 05:09:09
Foro de Hispabyte.netProgramaciónLenguajes y ProgramaciónC / C++ (Moderador: D4MR0D)Tema: Problema en C funcion realloc();
Páginas: [1]   Ir Abajo
Imprimir
Autor Tema: Problema en C funcion realloc();  (Leído 1764 veces)
0 Usuarios y 1 Visitante están viendo este tema.
†Inquisitor†
Visitante
« : Octubre 18, 2009, 12:45:23 »


Estoy inciado en el lenguaje C gracias a una asignatura del instituto y utilizo borlandc 3.1 para programar y tengo un pequeño programa que utiliza la función realloc, el programa consiste en que un usuario introduzca unos valores en un puntero y que una función calcule la media el valor mayor y el menor.

El problema viene ahora, los calculos de la media el valor mayor y el menos són correctos, pero cada vez que el usuario introduce un valor el vector se "realoja" con la función realloc ganando así un espació adicional y así sucesivamente hasta que el usuario decide parar de introducir valores, a modo de ir reservando memòria y no tener que dar un vector limitado.

El problema viene que al ejecutar la linea con la función realloc por quinta vez el puntero  pierde la mayoria de sus valores, alguien sabe cual es el problema?

Les dejo aqui el pequeño programa, si no entienden algo pregunten.
Gracias.
Código:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void valors(int*,float*,int);

void main(void){

   int x=0, y=0, *xifres;
                            //x= cantidad de numeros introducidos, xifres= puntero que contiene los numeros introducidos
   float result[3];
                            //result= resultados de media, mayor valor y menor valor respectivamente
      clrscr();
      xifres=(int *) malloc(1);
      printf("Introdueix les xifres, introdueix un nombre negatiu per acabar");

      do{
            scanf("\n%d",&y);
            if(y>=0){
                  *(xifres+x)=y;
                  xifres= (int*) realloc(xifres,1+x);
                  x++;
            }
      }while(y>=0);

      valors(xifres,result,x);
                                   //Printa los resultados

      printf("El valor mitj… del vector ‚s: %f", result[0]);
      printf("\nEl valor m…xim del vector ‚s: %f", result[1]);
      printf("\nEl valor m¡nim del vector ‚s: %f", result[2]);

      getch();

}
void valors(int *xifres,float *result, int x){

   int  z;
   float k, y=0;
//Calcula la media aritmética
      for(z=0;z<x;z++)
            y=y+*(xifres+z);

      *result=y/x;
//Calcula el valor màximo
      for(z=0;z<x;z++){
            if(z+1<x){
                  if(z==0){
                        if(*(xifres+z)>*(xifres+z+1))
                              y=*(xifres+z);
                        else
                              y=*(xifres+z+1);
                  }
                  if(y>*(xifres+z+1))
                        y=y;
                  else
                        y=*(xifres+z+1);
            }
      }

      *(result+1)=y;
//Calcula el valor mínimo
      for(z=0;z<x;z++){
             if(z+1<x){
                   if(z==0){
                         if(*(xifres+z)<*(xifres+z+1))
                               y=*(xifres+z);
                         else
                               y=*(xifres+z+1);
                   }
             if(y<*(xifres+z+1))
                   y=y;
             else
                   y=*(xifres+z+1);
             }
      }

      *(result+2)=y;
}

« Última modificación: Octubre 18, 2009, 04:31:44 por HQH » En línea
HQH
Administrator
Miembro Imprescindible
*****
Mensajes: 1.813



Ver Perfil
« Respuesta #1 : Octubre 18, 2009, 04:35:36 »

Creo que tienes un problema con el uso de la funcion malloc y realloc.

Al especificar el tamaño, se pone en bytes. Asi que si pones 1 a secas, coge 1 byte y en realloc lo mismo (al aumentar 1 cada vez), asi que te recomiendo que en malloc y realloc hagas algo asi
Código:
xifres=(int *) malloc(1*sizeof(int));
Asi te reservara 1 * el tamaño del tipo de datos a reservar (en el ejemplo int).

Para realloc lo mismo.

Un saludo.
En línea
†Inquisitor†
Visitante
« Respuesta #2 : Octubre 18, 2009, 05:15:54 »

  Sonreir Muchas Gracias era exactamente eso, problema solucionado.
En línea
Páginas: [1]   Ir Arriba
Imprimir
Foro de Hispabyte.netProgramaciónLenguajes y ProgramaciónC / C++ (Moderador: D4MR0D)Tema: Problema en C funcion realloc();
Ir a:  


Tema diseñado por RJ-45 para Hispabyte.net basado en el
theme famouspadexx v.09 designed by Formado Comprido
Downloable here. My present to padexx.de