/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Dichosa Violación de segmento

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
bobo100



Registrado: 26 Abr 2014
Mensajes: 2

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 26/04/2014 11:53 pm
Título:

Gracias por responderme Very Happy
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

MensajePublicado: 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:
Código:
*matriz_aux++;

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:
Código:
matriz_aux++;


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
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com