| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
bobo100
Registrado: 26 Abr 2014 Mensajes: 2
| Publicado: 26/04/2014 1:46 pm | | | Título: Dichosa Violación de segmento |
| Buenas noches! Intento leer de un fichero una matriz, empieza (en la 2a linea).Entonces reservo sitio y la leo.pero por más que prueba al ejecutar siempre me da violación de segmento.
¿Que hago mal?
Gracias por adelantado
| Código: | /* Declaración de funcions */ .............. void crea_matriz(float ***Q, float ***R); void carga_matriz_Q (float **Q);
char *entrada[1]; int n,m; /* ----------------------- Programa Principal ------------------------*/ int main(int argc, char *argv[]) { ......
crea_matriz(&Q,&R); carga_matriz_Q (Q); //visualizamos datos fichero //printf("\nn= %i, m= %i, E= %f \n", n, m, E); //visualizamos matriz printf("Matriz de probabilidades de transicion: \n"); for(i=0; i<n ;i++){ for(j=0; j<m ;j++) printf(" %f",Q[i][j]); printf("\n");
} exit(0); }
/* Funcions */
void crea_matriz(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"); fscanf(fichero,"\n"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { fscanf(fichero, "%f",& Q[i][j]); }} fclose(fichero); }
|
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 26/04/2014 4:22 pm | | | Título: |
| Hola
Bienvenido a los foros. Por favor lee sus reglas.
Cuando tengas una duda por favor publica el código fuente completo. Si no es posible porque este es muy largo entonces reducelo lo mas que puedas (por supuesto debe compilar).
En el fragmento que pones hay un error importante en la función "carga_matriz_Q", al intentar abrir el archivo con fopen:
| Código: | fichero = fopen(entrada[1], "r"); |
Los problemas con esa sentencia son varios: 1) No tiene caso declarar un array con un solo elemento (el array "entrada"). 2) En C los indices de los arrays inician en cero, "entrada[1]" seria el segundo elemento del array (no existe tal). 3) Cuando se declara una variable fuera de toda función su valor inicial es 0, 0.0 o NULL (este ultimo en tu caso con el array "entrada"). En el fragmento no le asignas una dirección valida.
Para solucionarlo se debe cambiar el fragmento, mas o menos asi:
| Código: | char *entrada = "Nombre del archivo de entrada";
/* ... */
fichero = fopen(entrada, "r"); |
Otro problema se encuentra en la misma función, en la primera llamada a fscanf:
| Código: | fscanf(fichero, "\n"); |
Si lo que tratas de hacer con ella es descartar la primera linea me temo que no tendrá ese efecto, en su lugar solo se descartara el espacio blanco (espacio, tabulador, etc.) al principio del archivo.
Para descartar la primera linea debes utilizar un bucle:
| Código: | {/* Descartamos la primera linea del archivo */ int ch; while ((ch = getchar()) != EOF && ch != '\n') ; } |
O si se debe utilizar si o si fscanf:
| Código: | fscanf(fichero, "%*[^\n]%*c"); |
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | bobo100
Registrado: 26 Abr 2014 Mensajes: 2
| Publicado: 26/04/2014 11:53 pm | | | Título: |
| Gracias por responderme  He intentado hacer lo que me dices,lo de despreciar la 1a linea,pero sigue dando error.Lo otro,yo creo que está bien,te pongo el código completo a ver que opinas:
| Código: |
/* Carga de librerias */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <unistd.h>
/* Declaración de funcions */ void verifica_parametros(int argc); void busca_nme (int *n, int *m, float *epsilon); void funcion_masa_p_arbitraria (float *pi_ini); void crea_matriz_Q_y_R (float ***Q, float ***R); void carga_matriz_Q (float **Q); void actualiza_R_pik1(float *pi_ini,float *pik1,float **Q, float ***R);
char *entrada[1]; int n,m; /* ----------------------- Programa Principal ------------------------*/ int main(int argc, char *argv[]) { /* Declaracion de variables */ int arg; int i,j,k; //variables auxiliares float epsilon; float *pi_ini,*pik1; float **Q, **R; for(i=0;i<=1;i++) entrada[i]=argv[i]; //copiamos parametros como variables verifica_parametros(argc); busca_nme (&n, &m, &epsilon); printf("n= %i, m= %i, epsilon= %f \n",n,m,epsilon); funcion_masa_p_arbitraria (&*pi_ini);
printf("\nVector de probilidades inicial: \n p = ("); for(i=0; i<n; i++){ printf("%.3f",pi_ini[i]); if(i == n-1) printf(")\n\n"); else printf(", "); }
crea_matriz_Q_y_R (&Q,&R); carga_matriz_Q (Q); //visualizamos datos fichero //printf("\nn= %i, m= %i, E= %f \n", n, m, E); //visualizamos matriz printf("Matriz de probabilidades de transicion: \n"); for(i=0; i<n ;i++){ for(j=0; j<m ;j++) printf(" %f",Q[i][j]); printf("\n");
} exit(0); }
/* Funcions */
void verifica_parametros(int argc) { if (argc != 2) { printf("Error de llamada a función\n"); printf("Sintaxis: ab nombreFichero \n"); exit(1); } }
void busca_nme (int *n, int *m, float *epsilon) { FILE *fichero; if ((fichero = fopen(entrada[1],"r"))== NULL) { //ficheiro vacio printf("Sintaxis: El fichero está vacio \n"); exit(1); } fscanf(fichero,"%i %i %f", n, m, epsilon); fclose(fichero); }
void funcion_masa_p_arbitraria (float *pi_ini) { int aux; int i;
for (i = 0; i < n - 1; i++) { pi_ini[i] = (1 - aux)*(float) rand() / ((float) (RAND_MAX)); aux = aux + pi_ini[i]; } pi_ini[i] = 1 - aux;
} 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; int ch; fichero=fopen(entrada[1],"r"); while ((ch = getchar()) != EOF && ch != '\n'); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { fscanf(fichero, "%f",& Q[i][j]); }} fclose(fichero); }
|
Seguro que es una auténtica tonterias,pero soy incapaz de verlo... Muchas gracias! |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 27/04/2014 5:46 pm | | | Título: |
| Como ya te comente el uso que le das al array "entrada" es un error. Por ejemplo si compilo y ejecuto este programa:
| Código: | #include <stdio.h> #include <stdlib.h>
char *entrada[1];
int main(int argc, char *argv[]) { FILE *in; int i; for (i = 0; i <= 1; i++) entrada[i] = argv[i]; in = fopen(entrada[i], "r"); fclose(in); return EXIT_SUCCESS; } |
En MS Windows obtengo el cuadro de dialogo con el conocido texto "<ejecutable> ha detectado un error y debe cerrarse ...".
----
Hay otros errores.
* Uno de estos ocurre en la función principal con la llamada:
| Código: | funcion_masa_p_arbitraria(&*pi_ini); |
Y se debe a que antes de utilizar la variable "pi_ini" debes reservar un bloque de memoria con una capacidad de "n" elementos de tipo float. Ademas el uso de los operadores "&*" se cancela, la llamada debería ser (una vez reservado el bloque de memoria):
| Código: | funcion_masa_p_arbitraria(pi_ini); |
* Las variables "arg", "k", "pik1" de la función main no las utilizas y, por ello, deberías eliminarla.
* Mismo caso con la variable "j" en la función "crea_matriz_Q_y_R".
* Falta la inicializacion a cero de la variable "aux" en la función "funcion_masa_p_arbitraria".
* En la funcion "crea_matriz_Q_y_R", en las dos ocurrencias de la sentencia:
El operador "*" esta de más ya que se procesa después del operador "++", no tiene efecto y hay que eliminarlo dejando las dos sentencias como:
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |