Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Tengo un error por algun lado y no lo veo

Estas en el tema de Tengo un error por algun lado y no lo veo en el foro de C/C++ en Foros del Web. Tengo hecho este programa. Consiste en generar un vector de numeros aleatorios entre 0 y 12, por ejemplo el vector [1 4 5]. Despues mediante ...
  #1 (permalink)  
Antiguo 10/11/2006, 08:41
 
Fecha de Ingreso: noviembre-2006
Mensajes: 82
Antigüedad: 17 años, 5 meses
Puntos: 0
Tengo un error por algun lado y no lo veo

Tengo hecho este programa. Consiste en generar un vector de numeros aleatorios entre 0 y 12, por ejemplo el vector [1 4 5]. Despues mediante una funcion se calcula cuantos dias tiene cada mes (mes 1, mes 4 y mes 5) y lo devuelve en otro vector. (Devolveria [31 30 31]).
Luego clona el vector [31 30 31] mediante una funcion a la que se le pasa el vector y devuelve otro con el clonado.
Y por ultimo invierte el contenido, mediante una funcion a la que se le pasa el vector y devuelve el mismo vector invertido.

Este es el codigo que tengo.

fichero1.c

Código:
#include <stdio.h>
#include <stdlib.h>

#include "ficheroh.h"

int esBisiesto(int anyo){
if(anyo%400==0) return 1;
else if (anyo%100==0) return 0;
else if (anyo%4==0) return 1;
}


int numDias(int mes, int anyo){
int num;
num=0;
switch(mes){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
num = 31;
break;
case 4: case 6: case 9: case 11:
num = 30;
break;
case 2:
num = 28;
if(esBisiesto(anyo)==1) num=num+1;
break;
}
return num;
}

int * clonar(int *a,int tam){
int * temp;
int i;
i=0;
temp =(int*)malloc(tam*sizeof(int));
while(a[i]!=0){
temp[i]=a[i];
i++;
}
return temp;
}

int * invertir(int *a, int tam) 
{ 
     int i,j,aux; 
          
     j=tam-1; 
     for (i=0;i<tam/2;i++) 
     { 
       aux=a[i]; 
       a[i]=a[j]; 
       a[j]=aux; 
       j--; 
     }
	 return a;
}

int * diasPorMes(int*a,int tam,int anyo){
int i;
int *temp;
i=0;
temp =(int*)malloc(tam*sizeof(int));
while(a[i]!=0){
temp[i]=numDias(a[i],anyo);
i++;
}
return temp;
}

ficheroh.h

Código:
#include <stdio.h>

#ifndef _FICHEROH_H
#define _FICHEROH_H

int esBisiesto(int anyo);
int numDias(int mes, int anyo);
int * clonar(int *a,int tam);
int * invertir(int* a, int tam);
int * diasPorMes(int*a, int tam,int anyo);

#endif
fichero2.c, donde esta el main

Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ficheroh.h"

#define LIMITE 12

  int main(){
  int * vector;
  int * res;
  int * clon;
  int * invertido;
  int tamano;
  int anyo;
  int i;
  char c;

  //Preguntar tamaño del array
  printf("Tamaño del array: ");
  scanf("%d",&tamano);

  vector = (int *)malloc(tamano*sizeof(int));
  res = (int *)malloc(tamano*sizeof(int));
  clon = (int *)malloc(tamano*sizeof(int));
  invertido = (int *)malloc(tamano*sizeof(int));

  //Inicializar array con numeros aleatorios del 0 al 12
  srand((int)time(NULL));

 	for (i = 0;i<tamano;i++)
    vector[i] = (int)(rand() % LIMITE);

    //Ver array creado
    for(i=0;i<tamano;i++)
	printf("valor[%d]=%d\n",i,vector[i]);
    printf("\n");

 //Preguntar al usuario año concreto
 printf("Año: ");
 scanf("%d",&anyo);

 //Calcular dias del array creado, mediante funcion diasPorMes
 res = diasPorMes(vector,tamano,anyo);

 //Imprimir array calculado
 printf("Array calculado:\n");

 for(i=0;i<tamano;i++)	 
 printf("Valor[%d]=%d\n",i,res[i]);

 //Clonar array calculado
 clon = clonar(res,tamano);

 //Invertir el clon
 invertido = invertir(clon, tamano);
 printf("Array tras clonar e invertir:\n");
 
  //Imprimir tras invertir
   for(i=0;i<tamano;i++)
	printf("Valor[%d]=%d\n",i,invertido[i]);

 free(vector);
 free(res);
 free(clon);
 free(invertido);
   scanf("%c", &c);
 return 0;
  }

Al ejecutar, el programa da error cuando tiene que hacer el clonado. No soy capaz de encontrar el error, alguien podria ayudarme? gracias
  #2 (permalink)  
Antiguo 10/11/2006, 09:50
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Hay una excepcion no controlada al intentar liberar invertido, linea 65 de fichero2.c; solo lo compile y lo depure. No puedo ponerme a leer todo ese codigo ... pero veo que invertido y clon tienen exactamente el mismo valor y los estas liberando a ambos.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 10/11/2006, 17:52
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
con respecto a las funciones clonar y diasPorMes puedo ver:

a pesar de pasar el tamaño del vector el bucle while esta condicionado por la búsqueda de un 0 en el vector, esto es valido con cadenas de caracteres en este caso no estoy seguro de que estés usando un delimitador 0 en tus vectores generados aleatoriamente.
lo correcto seria usar como limite del bucle el tamaño del vector.
ejemplo:
for(i = 0; i < tam; i++);

Tambien, estas retornan un puntero el cual fue reservado dentro de la función, por tanto estas funciones delegan responsabilidades al receptor.
sin embargo tu reservas memoria previo a su uso:

res = (int *)malloc(tamano*sizeof(int));
clon = (int *)malloc(tamano*sizeof(int));

y luego haces esto:

//Calcular dias del array creado, mediante funcion diasPorMes
res = diasPorMes(vector,tamano,anyo);

//Clonar array calculado
clon = clonar(res,tamano);

al hacer esto, olvidas que las funciones reservarán memoria para estos punteros.

no es necesario reservar la memoria o de lo contrario eliminarla antes de usar la funciones.(si es que estos punteros(vectores) se usaran antes).

free(res);
res = diasPorMes(vector,tamano,anyo);
free(clon);
clon = clonar(res,tamano);

sin olvidar liberar también al final.


Tu función invertir podría funcionar de forma similar a como funcionan las funciones clonar y diasPorMes, para evitar:

Modificar el vector pasado como parámetro y que dos punteros apunten al mismo vector.
Ya que después de llamar a la función invertir, tanto clon como invertido contienen lo mismo.


Saludos.

Última edición por Nivel7; 10/11/2006 a las 17:59
  #4 (permalink)  
Antiguo 11/11/2006, 01:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Se ve que hay gente muy ociosa ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 13/11/2006, 11:21
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Nivel7 siempre está ocioso cuando se trata de escribir más que los demás para terminar diciendo más o menos lo mismo.
  #6 (permalink)  
Antiguo 14/11/2006, 11:53
lpz
 
Fecha de Ingreso: abril-2006
Ubicación: Argentina
Mensajes: 402
Antigüedad: 18 años
Puntos: 2
Ustedes 3 siempre haciendo competencia de quien sabe mas de c jajajaj :P
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:29.