elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda, violación de segmento
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda, violación de segmento  (Leído 4,493 veces)
antolinalvaro

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Ayuda, violación de segmento
« en: 2 Diciembre 2018, 11:46 am »

Buenos días.
¿Alguien sabe por que me da violacion de segmento (core generado) este código?
Incluyo tambien el fichero por si puede ayudar.

Código
  1. /*Incluyo las libreria stdio.h porque voy a usar ficheros*/
  2. #include<stdio.h>
  3. /*Añado la libreria string.h para poder usar strings o cadenas*/
  4. #include<string.h>
  5. /*Defino las longitudes maximas dpara vectores y cadenas de caracteres*/
  6. #define DIMMAX 200
  7. #define STRMAX 200
  8. /*Realizo la primera funcion del programa, en la cual pido el nombre del fichero de lectura.
  9.   Argumentos de entrada:
  10.     char NombreFichero[]: Variable de tipo char donde tengo el nombre del fichero de lectura
  11.     FILE* Fichero: Variable de tipo FILE donde esta el fichero de lectura de datos
  12.   Argumentos de salida:
  13.     No tiene
  14. */
  15. void pedirNombre(){
  16.  char NombreFichero[100];
  17.  FILE* Fichero;
  18. /*Uso un bucle do...while, para pedir el fichero hasta que se logre abrir*/
  19.  do {
  20.    printf("Dame el nombre del fichero: ");
  21.    scanf("%s",NombreFichero);
  22.    Fichero = fopen(NombreFichero,"r");
  23. /*Si no lo logra abrir, se lo comunica al usuario por pantalla*/
  24.    if(Fichero==NULL){
  25.      perror("No se consiguio abrir el fichero\n");
  26.    }
  27.  } while(Fichero==NULL);
  28. }
  29. /*Hago la funcion principal, donde recopilo toda la informacion de mi programa*/
  30. int main(){
  31.  char NombreFich[STRMAX];
  32.  FILE* Fich;
  33.  float CantidadNumeros,Numeros[DIMMAX],SumaNumeros,Media;
  34.  int i;
  35. /*Llamo a la funcion anterior*/
  36.  pedirNombre(&NombreFich,&Fich);
  37. /*Abro el fichero de lectura de datos*/
  38.  Fich = fopen(NombreFich,"r");
  39. /*Inicializo las variables a 0 para el bucle, que me recorrera todo el fichero*/
  40.  CantidadNumeros = 0;
  41.  SumaNumeros = 0;
  42.  i = 0;
  43.  while(!feof(Fich)) {
  44. /*Leo los numeros del fichero y los almaceno en un array flotante*/
  45.    fscanf(Fich,"%f ",&Numeros[i]);
  46. /*Sumo dichos numeros*/
  47.    SumaNumeros = SumaNumeros + Numeros[i];
  48.    i = i + 1;
  49.    CantidadNumeros = CantidadNumeros + 1;
  50.  }  
  51. /*Calculo la media de los numeros y devuelvo la informacion por pantalla*/
  52.  Media = SumaNumeros / CantidadNumeros;
  53.  printf("En el fichero hay: %.0f numeros\nLa media de los numeros del fichero es: %f\n",CantidadNumeros,Media);
  54. /*Cierro el fichero al acabar el programa*/
  55.  fclose(Fich);
  56. }


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda, violación de segmento
« Respuesta #1 en: 2 Diciembre 2018, 11:53 am »

La función <pedirNombre()> dices que tiene argumentos de entrada pero en la implementación de la función no los tiene...


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
antolinalvaro

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda, violación de segmento
« Respuesta #2 en: 2 Diciembre 2018, 11:57 am »

¿Quieres decir que he de declarar las variables entre los parentesis?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda, violación de segmento
« Respuesta #3 en: 2 Diciembre 2018, 12:01 pm »

Tienes que poner los parámetros que le pasas a la función, claro.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
antolinalvaro

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda, violación de segmento
« Respuesta #4 en: 2 Diciembre 2018, 12:09 pm »

Me sigue dando violacion de segmento
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda, violación de segmento
« Respuesta #5 en: 2 Diciembre 2018, 12:35 pm »

Envía el código de tu programa a ver cómo has hecho los cambios.

Edit: Te escribo aquí un par de cosas más para agilizar esto. Hay dos formas de hacer lo que quieres hacer (bueno igual hay más pero te voy a comentar dos):
- Forma 1: Pasar el puntero a <FILE> como parámetro y que el fichero se abra en la función. Para ello hay que pasar el puntero por referencia y en C todo el paso de parámetros se hace por valor. Entonces no tienes que pasar un <FILE*>, sino un <FILE**>.
Código
  1. void pedirNombre(char nombreFichero[], FILE **fichero){
  2.    do{
  3.        printf("Nombre del fichero: ");
  4.        scanf("%s", nombreFichero);
  5.        *fichero = fopen(nombreFichero, "r");
  6.        if(*fichero == NULL)
  7.            perror("Error al abrir el archivo\n");
  8.    }  while(*fichero == NULL);
  9. }
  10.  
  11. int main(){
  12.    char nombreFichero[STRMAX];
  13.    FILE *fichero;
  14.    pedirNombre(nombreFichero, &fichero);
  15.    // ahora ya haces lo que quieras con <fichero> pues ya esta el fichero abierto
  16. }

- Forma 2: Pasar como parámetro la cadena donde vas a guardar el nombre y hacer que la función devuelva <FILE*>. En ese caso tendrías que asignar el retorno de la función a una variable de tipo <FILE*>.
Código
  1. FILE* pedirNombre(char nombreFichero[]){
  2.    FILE *fichero;
  3.    do{
  4.        printf("Nombre del fichero: ");
  5.        scanf("%s", nombreFichero);
  6.        fichero = fopen(nombreFichero, "r");
  7.        if(fichero == NULL)
  8.            perror("Error al abrir el archivo\n");
  9.    }  while(fichero == NULL);
  10.    return fichero;
  11. }
  12.  
  13. int main(){
  14.    char nombreFichero[STRMAX];
  15.    FILE *fichero = pedirNombre(nombreFichero);
  16.    // Y ahora ya haces lo que quieras con <fichero>
  17. }

Ahora recomendaciones aparte:
- Usas una variable de tipo <float><cantidadNumeros> que siempre va a ser un entero ya que sumas de uno en uno y luego usas una variable tipo <int><i> que hace exactamente lo mismo que <cantidadNumeros>. Una de las dos sobra. Pensarás que para que en <media> se guarde un <float> ambos operandos deben ser <float> pero con que lo sea uno es suficiente, entonces con que <suma> sea de tipo <float>, la media también lo va a ser.

- Al finalizar el programa haces <%.0f> para mostrar la cantidad de números sin decimales. Usa <%d> que sirve para representar enteros y deja el <%.2f> por ejemplo para la media (o con los decimales que quieras).

- Para inicializar los contadores y sumas a 0 lo puedes hacer a la vez que los declaras y así lo haces de una vez. Porque si lo haces por separado puedes usar el valor de una variable antes de inicializarla por lo que tendría basura en ese momento.

- Tu programa también funciona si como has hecho tú abres el fichero en la función <pedirNombre()> y como no lo has pasado por referencia lo vuelves a abrir en el <main> pero es una solución un poco absurda tener que abrirlo en los dos sitios.

Corrige los fallos que tienes y fíjate en cómo están implementadas las dos formas de hacer la función que te he puesto arriba ya que tienen algunas sutiles diferencias por si hay algo que no entiendas. Suerte.
« Última modificación: 2 Diciembre 2018, 13:19 pm por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ayuda, violación de segmento
« Respuesta #6 en: 2 Diciembre 2018, 15:41 pm »

El nombre del archivo solo se usa para abrir este, no tiene otra utilidad, de modo que la funcion que lo abre podria llamarse, por ejemplo, abrirArchivo, no pasar ningun parametro y retornar el FILE*. Internamente puede definir la variable que guarda el nombre, no es necesario definirla en el main, pasarsela a la funcion y modificarla. Una excepcion seria que que despues el main la use para algo, pero no es el caso aqui.

Código
  1. FILE* abrirArchivo() {
  2.    char nombre[ALGUN_TAMANO_AQUI];
  3.    FILE* archivo;
  4.    ..
  5.    // pedir nombre, do-while, etc. usarlo para abrir el archivo
  6.  
  7.    return archivo;
  8. }
  9.  
  10. int main() {
  11.     FILE* archivo = abrirArchivo();
  12.  
  13.     // usar archivo
  14.  
  15.    return 0;
  16. }
  17.  
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con violación de segmento « 1 2 »
Programación C/C++
Triper0 17 17,115 Último mensaje 8 Noviembre 2015, 21:34 pm
por alesurf1989
ayuda violacion de segmento?
Programación General
nightcode 7 4,383 Último mensaje 31 Diciembre 2013, 18:32 pm
por nightcode
Violación de Segmento
Programación C/C++
Jaquieline_JJ 1 2,251 Último mensaje 24 Abril 2014, 04:11 am
por engel lex
Violacion segmento en C Linux
Programación C/C++
Xin_J.D 2 2,567 Último mensaje 31 Marzo 2018, 00:33 am
por BloodSharp
Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento
Programación C/C++
Pitagoras 9 4,323 Último mensaje 3 Diciembre 2021, 20:24 pm
por Pitagoras
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines