C/Visual C - Violación de segmento al crear matriz

   
Vista:

Violación de segmento al crear matriz

Publicado por jodido (1 intervención) el 26/04/2014 19:01:05
Buenas tardes!

A ver si alguien me puede dar algo de luz a esta gran oscuridad que se cierne sobre mi... Llevo la tarde con esto y soy incapaz de verlo... El caso es que me sale una violación de segmento y no soy capaz de arreglarlo.El trozo del código es bien sencillo:

void crea_matriz_Q_y_R (float ***Q, float ***R)
{

int i,j;
float **matriz_aux;

*R=(float **)malloc(n*sizeof(float *)); //creamos as filas
matriz_aux=*R;
for(i=0;i<n;i++){
*matriz_aux=(float *)malloc(m*sizeof(float));//crea as columnas
*matriz_aux++;
}

*Q=(float **)malloc(n*sizeof(float *)); //creamos as filas
matriz_aux=*Q;
for(i=0;i<n;i++){
*matriz_aux=(float *)malloc(m*sizeof(float));//crea as columnas
*matriz_aux++;
}
}



void carga_matriz_Q (float **Q)
{

FILE *fichero;
int i,j;
;

fichero=fopen(entrada[1],"r");
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
fscanf(fichero, "%f", Q[i][j]);
}}

fclose(fichero);
}
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

Violación de segmento al crear matriz

Publicado por eldeantes (2 intervenciones) el 26/04/2014 21:20:58
Por favor,que alguien me ayude :(
Solo quiero reservar el sitio para 2 matrices y una leerla del fichero.Ahora é probado esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void crea_matriz_Q_y_R (float *Q, float *R){
FILE *fichero;
int i,j;
 
 
fichero=fopen(entrada[1],"r");
Q = (float *)malloc(n * m * sizeof(float));
 
 for (i = 0; i < n; ++i)
  {
    for (j = 0; j < m; ++j)
      {
        printf("Type a number for <line: %d, column: %d>\t", i+1, j+1);
        fscanf(fichero,"%f", &Q[i*n + j]);
      }
    fclose(fichero);
  }
}

Me voy a volver loco...Malditos punteros

Graciaassss
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

Violación de segmento al crear matriz

Publicado por UnoPorAhi (15 intervenciones) el 27/04/2014 09:42:46
Por más que miro, no tengo la más remota idea de lo que pretendes hacer en tu código.

Te pongo como puedes reservar memoria para una matriz sin problemas. Pero recuerda que al final hay que liberar!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void crea_matriz(float **R) {
    int i, j;
 
    R = malloc(n * sizeof (float *));
    for (i = 0; i < n; i++) {
        R[i] = malloc(m * sizeof (float));
    }
 
    // Hacemos un test
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++)
            R[i][j] = i+j;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++)
            printf("%f ", R[i][j]);
    }
}


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

Violación de segmento al crear matriz

Publicado por Chema (187 intervenciones) el 27/04/2014 14:29:45
Hombre... No te vuelvas loco , C es muy sencillo, solo tienes que empujar la tecla adecuada.

Un ejemplo para que no te vuelvas loco y veas claramente el uso de puntero y matrices,


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
#define SIZE_ROW 8
#define SIZE_COLUM 4
int main(void){
	char **ar;
	int i,x;
	char *buf;
	buf = malloc(8192);
	ar = (char**)(char*)buf;
	char *p = (char*) buf+sizeof(ar)*SIZE_COLUM;
 
	for(i = 0; i < SIZE_COLUM; i++){
		*(ar+i) = (char*)p;
		p+=SIZE_ROW;
		memmove(*(ar+i),"aaabaaa\0",SIZE_ROW);
	}
 
	for(i = 0; i < SIZE_COLUM; i++){
			printf("\n%s",ar[i]) ;
	}
	printf("\n-------------------") ;
		memmove(&ar[0][0],"1111111\0",SIZE_ROW);
		memmove(&ar[1][0],"2222222\0",SIZE_ROW);
		memmove(&ar[2][0],"3333333\0",SIZE_ROW);
		memmove(&ar[3][0],"4444444\0",SIZE_ROW);
 
	for(i = 0; i < SIZE_COLUM; i++){
			printf("\n%s",*(ar+i)) ;
		for(x = 0; x < SIZE_ROW; x++){
			printf("\n%c",*(*(ar+i)+x) ) ;
		}
		printf("\n----------") ;
	}
 
 
	free(buf);
}
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

Violación de segmento al crear matriz

Publicado por Chema (187 intervenciones) el 27/04/2014 20:23:01
Este ejemplo es más sencillito, usa una matriz de un elemento, espero te aclare tus dudas dudosas.

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
#define SIZE_ROW 8
#define SIZE_COLUM 4
#define TOTAL (SIZE_COLUM * sizeof(int) )
 
const char* Msg[SIZE_COLUM] = { "AaaaaaA\0", "BbbbbbB\0","CcccccC\0","DdddddD\0" };
 
int main(void){
	char *buf;
	char *p ;
	int i,j;
	int *x;
 
	buf = malloc(8192);
 
	x =(int*)buf;
	for(i = 0 ; i <SIZE_COLUM; i++){
		*x=TOTAL+i*SIZE_ROW;
		 p=buf+*x;
		 memmove(p,Msg[i],SIZE_ROW);
		x++;
	}
 
	x =(int*)buf;
	for(i = 0 ; i <SIZE_COLUM; i++){
		p=buf+*x;
		printf("\n%s",p);
		for(j = 0 ; j <SIZE_ROW; j++){
			printf("\n%c",*(p+j));
		}
		x++;
	}
 
	free(buf);
	return 0;
}
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

Violación de segmento al crear matriz

Publicado por Chema (187 intervenciones) el 28/04/2014 00:26:08
El ejemplo anterior, con escritura y lectura en disco. el código es facilito de comprender, no te volverás más loco.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define SIZE_COLUM 50
#define SIZE_ROW 20
#define SIZE_BUF 8192
#define TOTAL (SIZE_COLUM * sizeof(int) )
 
char data[SIZE_COLUM][SIZE_ROW];
 
 
int main(void){
	char *buf;
	char *p ;
	int i,j;
	int *x;
	int r=0;
 
	/* SIZE_ROW * 4 +SIZE_COLUM no debe ser superior a SIZE_BUF*/
	srand (time(NULL));
 
	/*Cargar la matriz data con datos aleatorios*/
	for(j=0; j <SIZE_COLUM; j++){
		r =(rand() % SIZE_ROW+1);
 
		for(i =0 ; i < r ; i++){
			data[j][i]=  (rand() % 26 + 'a');
		}
		data[j][i] = '\0';
	}
 
	buf = malloc(SIZE_BUF);
 
	x =(int*)buf;
	for(i = 0 ; i <SIZE_COLUM; i++){
		*x=TOTAL+i*SIZE_ROW;
		 p=buf+*x;
		 memmove(p,data[i],SIZE_ROW);
		x++;
	}
	/*--------------------------------------------------------*/
	/*------------ Escritura  datos-------------------------*/
	/*--------------------------------------------------------*/
	FILE *fl;
	if((fl = fopen("./data","w+b"))== NULL){
		printf("Ruta incorrecta");
	}
 
	fwrite(buf,1,SIZE_BUF,fl);
	fclose(fl);
	free(buf);
	/*--------------------------------------------------------*/
	/*------------ Lectura datos----------------------------*/
	/*--------------------------------------------------------*/
	if((fl = fopen("./data","r+b"))== NULL){
		printf("Ruta incorrecta");
	}
 
	int *arr;
	char *ptr;
	char c;
	char *filebuf = malloc(SIZE_BUF);
 
 
	fread(filebuf,SIZE_BUF,1,fl);
 
	arr =(int*)filebuf;
 
	for(i = 0 ; i <SIZE_COLUM; i++){
		ptr=filebuf + *arr;
		printf("\n%s",ptr);
		//~ /*descomentar si se desea comprobar ptr[i][j]*/
		//~ printf("\n");
		//~ for(j = 0 ; j <SIZE_ROW; j++){
			//~ c = *(ptr+j);
			//~ if(!c)
				//~ break;
			//~ printf("-%c",c);
		//~ }
 
		arr++;
	}
 
	fclose(fl);
	free(filebuf);
	return 0;
}
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

Violación de segmento al crear matriz

Publicado por Tom (481 intervenciones) el 28/04/2014 17:56:22
En mi opinión, dos cosillas:
1.- ¿ Dónde se produce el SIGSEGV ? Es un dato fundamental.
2.- Cuando no se tiene mucha práctica con el tema de punteros es mejor simplificar su uso. En tu caso, no parece necesario realmente el uso de un array de punteros, con un array de floats sin más te bastaría (como en muchísimos otros casos).

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
/* */
float *creaMatriz(int f, int c) {
	return (float*)calloc(f, c * sizeof(float));
}
/* */
void *rellenaMatriz(float *m, int f, int c) {
	float test = 0.0;
 
	for(int i = 0; i < f; i++) {
		for(int j = 0; j < c; j++, test = i * j / 2.0) {
			m[i * f + j] = test;
		}
	}
}
/* */
int main(int argc, char *argv[]) {
	float	*q, *r;
	int	filas, cols;
 
	filas = 7;
	cols = 20;
 
	q = creaMatriz(filas, cols);
	rellenaMatriz(q, filas, cols);
}
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

Violación de segmento al crear matriz

Publicado por Chema (187 intervenciones) el 28/04/2014 19:55:03
Hola Toni, la matriz debe acabar escrita y leída en un fichero.

La paradoja ,es que no se deben guardar punteros en un fichero binario, no sirven para su posterior lectura.
El no uso de punteros en escritura es lo que guía mis ejemplos anteriores, un poco liados para "que lo trabajen" y entiendan que lo que realmente vale no es el código, ni el cortar y pegar, lo que vale es la comprensión y sobre todo la técnica
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