C/Visual C - Segmentation fault en 3ª iteración de un bucle

   
Vista:

Segmentation fault en 3ª iteración de un bucle

Publicado por Eloy (2 intervenciones) el 31/03/2014 00:33:31
Código Main

El fallo me lo da el bucle en su 3ª iteración (sólo he pegado código relevante).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "vectordinamico.h"
#include "quicksort.h"
 
/*
 * 
 */
 
void inicializaVectorRand(vectorP v1){
    unsigned long posicion1;
    TELEMENTO valor;
    for (posicion1=0;posicion1<tamano(v1);posicion1++){
         valor=(rand()%500);
         asignar(&v1,posicion1,valor);
    }
}
 
int main(int argc, char** argv) {
    FILE *q, *s;
    clock_t inicio=-1, fin=-1; /*calculo de tiempos*/
    vectorP v1; /*el vector*/
    int hora=time(NULL); /*factor usado como semilla de rand()*/
    unsigned long i; /*&iacute;ndice*/
    short creado=0, ronda=0; /*Valores de control*/
    srand(hora);
 
    if((q = fopen("quicksort.txt", "w+"))==NULL) printf("El archivo quicksort.txt no ha podido crearse\n\n");
    else printf("quicksort.txt creado con exito.\n\n");
 
    for(i=10000;i<100001;i=i+10000){
        if(creado==1){ liberar(&v1); creado = 0;}
        crear(&v1, i);  creado = 1;
        inicializaVectorRand(v1);
        inicio = clock();
        quicksort(&v1, 0, i-1);
        fin = clock();
        printf("n=%u\tt(n)=%lf\n", i, (fin-inicio)/(double)CLOCKS_PER_SEC);
        fprintf(q, "n=%u\tt(n)=%lf\n", i, (fin-inicio)/(double)CLOCKS_PER_SEC);
        liberar(&v1); creado = 0;
        printf("QSbucle: %d\n", ronda);
        ronda++;
    }
 
    printf("Quicksort terminado.\n");
    if(fclose(q)!=0) printf("Error al cerrar el archivo quicksort.txt\n\n");
    else printf("quicksort.txt cerrado con exito\n\n");
}

Código del Vector Dinámico

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdlib.h>
#include <stdio.h>
 
typedef int TELEMENTO;
typedef struct {
        TELEMENTO *datos; /*valores del vector*/
        unsigned long tam; /*tamaño del vector*/
}STVECTOR; /*definición de la estructura*/
typedef STVECTOR *vectorP; /*puntero a estructura*/
/*Función crear: asigna memoria y devuelve la asignación al
vector*/
void crear(vectorP *v1,unsigned long tam1)
{
unsigned long i=0;
*v1=(vectorP)malloc(sizeof(STVECTOR));
(*v1)->datos=(TELEMENTO*)malloc(tam1*sizeof(TELEMENTO));
(*v1)->tam=tam1;
for(i=0; i < tam1; i++)
*((*v1)->datos+i) = 0; //Inicialización a 0
}
/*Función asignar: Llena una posición del vector con un valor*/
void asignar(vectorP *v1,unsigned long posicion, TELEMENTO valor)
{
*((*v1)->datos+posicion)=valor;
}
 
void liberar(vectorP *v1){
free((*v1)->datos);
free(*v1);
 
}
 
void recuperar(vectorP v1, unsigned long posicion, TELEMENTO *E){
   *E=*((v1)->datos+posicion);
 
}
 
unsigned long tamano(vectorP v1){
    return v1->tam;
}
 
void swap (vectorP *v, unsigned long a, unsigned long b){
    TELEMENTO aux;
    aux = *((*v)->datos+a);
    *((*v)->datos+a) = *((*v)->datos+b);
    *((*v)->datos+b) = aux;
}
El fallo me lo marca en la línea 33: la función recuperar.

No entiendo por qué me da el fallo en la 3ª it y en las anteriores no. Espero que podáis ayudarme.
Gracias por la atención a los que hayáis leído.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Segmentation fault en 3ª iteración de un bucle

Publicado por Eloy (2 intervenciones) el 31/03/2014 00:55:29
Perdonad. Ya lo he arreglado.
A quien se haya molestado en leerlo, de nuevo gracias.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Segmentation fault en 3ª iteración de un bucle

Publicado por xve (18 intervenciones) el 31/03/2014 09:25:30
Hola Eloy, muchas gracias por comentarlo, pero cual era el error?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar