Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

Error de compilacion en C

Participa en el tema Error de compilacion en C en el foro Programación.
Acabo de empezar en C, y decidí hacerlo en linux, compilando con gcc me aparece ...

Buscar en este tema:
 
  •  
    #1 Error de compilacion en C
    Acabo de empezar en C, y decidí hacerlo en linux, compilando con gcc me aparece el error Segmentation default despues de imprimir la variable nombre con getch(). Ya se que el codigo es comico y una basura pero solo es para probar. Se que falta poner pausas pero no logro que ande system("pause") de stdlib.h en linux.

    #include <stdio.h>


    int main()
    {
    int decision;
    int nombre,personaje;
    int corres,esconderte;
    printf("Cual es tu nombre? \n");
    nombre = getchar();
    printf("Bienvenido %s \n",nombre);
    printf("Nombre de tu personaje \n ?");
    personaje = getchar();
    printf("Esto es un juego de texto \n \n");
    printf("Te encuentras en una calle llena de \n");
    printf("zombies, decides esconderte en una casa ,\n");
    printf("o corres? \n");
    decision = getchar();
    if (decision = corres)
    {
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    }
    if (decision = esconderte)
    {
    printf("Te resguardas en una casa y te matan un perro zombie \n");
    }
    getchar();
    return 0;
    }
    +
     
    0
    Me gusta
     
    http://www.psicofxp.com/forums/programacion.313/970080-error-de-compilacion-en-c.html
    | Más
  • #2 Re: Error de compilacion en C

    Hay varios errores en tu codigo, el primer error es no leer adecuadamente la documentacion de C...

    Si leyeras la documentacion de C, la funcion getchar devuelve el proximo objeto disponible en el stream de datos, es decir si tenes un stream de caracteres como generalmente es la entrada estandard getchar te devuelve el proximo caracter disponible, y digo el proximo y no todo lo que se ingresa x teclado, si ingresaste una palabra de 10 letras, solo te devuelve 1 y quedan 9 en el buffer para ser leidas despues...

    Eso por un lado, por otro lado la funcion printf("......%s",.....); cuando tiene el formato %s es que va a escribir un string representado por un puntero a char terminado en caracter NULO o /0, pero estas usando un int que leiste con getchar lo cual interpreta el contenido de ese int como la direccion de memoria donde comienza el string a escribir, y como generalmente ese numero que contiene el int no es una posicion de memoria, trata de acceder a una posicion de memoria invalida y lanza el famoso segmentation fault que indica que accediste a memoria invalida o estas manipulando memoria que no le corresponde a tu programa...

    Por otro lado acordate que estas en GNU / Linux, la funcion system lo que hace es invocar un comando del sistema operativo, en el caso de Ms Windows, hay un comando de DOS llamado pause que pausa la consola mostrando un error hasta que aprietes una tecla, en GNU / Linux no hay nada similar entonces ejecutar system("pause"); en linux no tiene efecto, es mas dice que el comando pause no existe y no se puede ejecutar...

    Saludos
    Pablo
    Me gusta este mensaje
  • #3 Re: Error de compilacion en C

    Ademas de todos los errores que te marco ExtrañoInocente estas teniendo errores semanticos..

    if (decision = corres)
    {
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    }
    if (decision = esconderte)
    {
    printf("Te resguardas en una casa y te matan un perro zombie \n");
    }

    por empezar corres y esconderte jamas fueron inicializadas
    decision = corres, no es una comparacion, es una asignacion, por lo tanto a decision le estas asignando basura de corres, lo mismo pasa con esconderte. Lo mejor seria..

    int corres = 1, esconderte = 0;

    if (decision == corres)
    {
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    }
    else if (decision == esconderte)
    {
    printf("Te resguardas en una casa y te matan un perro zombie \n");
    }


    o sino una mejor manera de escribir esto seria sin usar la variable decision..

    int corres;

    .. tu codigo ..
    corres = getchar();

    if (corres)
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    else
    printf("Te resguardas en una casa y te matan un perro zombie \n");

    Espero que te haya sido util!
    saludos!
    Me gusta este mensaje
  • #4 Re: Error de compilacion en C

    Originalmente publicado por mancinigaston Ver mensaje
    Ademas de todos los errores que te marco ExtrañoInocente estas teniendo errores semanticos..

    if (decision = corres)
    {
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    }
    if (decision = esconderte)
    {
    printf("Te resguardas en una casa y te matan un perro zombie \n");
    }

    por empezar corres y esconderte jamas fueron inicializadas
    decision = corres, no es una comparacion, es una asignacion, por lo tanto a decision le estas asignando basura de corres, lo mismo pasa con esconderte. Lo mejor seria..

    int corres = 1, esconderte = 0;

    if (decision == corres)
    {
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    }
    else if (decision == esconderte)
    {
    printf("Te resguardas en una casa y te matan un perro zombie \n");
    }


    o sino una mejor manera de escribir esto seria sin usar la variable decision..

    int corres;

    .. tu codigo ..
    corres = getchar();

    if (corres)
    printf("Saliste corriendo, te topaste con un zombie y moriste \n");
    else
    printf("Te resguardas en una casa y te matan un perro zombie \n");

    Espero que te haya sido util!
    saludos!
    Es cierto es distinto si yo hago = que == dentro de un if, la semantica es diferente en el primer caso me asigna una variable a la otra (sin comparar) y devuelve la variable asignada (que en C si es distinto de 0 es true y si es cero es false)... con lo cual hacer

    if (corres = variable) da siempre true a menos que variable tenga 0...

    Esto es util para hacer monton de comparaciones y asignaciones locas como...

    if ((cadena = strtok(cadena, "") != NULL) {
    }

    O si estas recorriendo una lista enlazada

    while (actual = actual->siguiente) {
    .....
    }

    Saludos
    Pablo
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 3 RESPUESTAS
  • 116 VISTAS
  • 3 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB