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

 

 


Tema destacado: Introducción a Git (Primera Parte)


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

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #10 en: 26 Julio 2011, 22:28 pm »

Si, es un seminario de lenguaje C, no nos permiten ni C++ ni C#.
Es más, nos hicieron hacer un trabajo final de manejos de .BMP y nos hicieron hacer todo por nuestra cuenta, nada de usar funciones predefinidas de BMP ni nada, todo manual...
Aprendí bastante, pero fue un dolor de cabeza importante, jaja...

Jaja me lo imagino  :xD


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Problema con violación de segmento
« Respuesta #11 en: 26 Julio 2011, 22:34 pm »

Te recomiendo que leas mas sobre punteros, con respecto a #define fíjate que estas poniendo ';' al final y ahí no lleva ';'


En línea

Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #12 en: 26 Julio 2011, 22:47 pm »

Si, justamente lo que mas me cuesta son las listas en C... En Pascal las manejo de diez, pero con C y el tema de los punteros me agarro un lindo pedalin...
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #13 en: 27 Julio 2011, 02:49 am »

En C la conversión explicita no es necesaria y no se recomienda, en este lenguaje el idioma (convención informal) para reservar memoria es:
Código
  1. p = malloc(N * sizeof *p);
Donde N es el numero de elementos.

En tus programas (me refiero a Triper0) sigues con el mismo error que ya te mencionaron: reservas memoria para "sizeof(algun_puntero)" cuando el tamaño debería indicar el tamaño del objeto apuntado. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LONG_MAX_LINEA  1024
  5.  
  6. int main(void)
  7. {
  8.   char *p;
  9.  
  10.   if ((p = malloc(LONG_MAX_LINEA)) == NULL)
  11.      return EXIT_FAILURE;
  12.  
  13.   puts("Introduce una linea de texto:");
  14.   if (fgets(p, LONG_MAX_LINEA, stdin) == NULL)
  15.      return EXIT_FAILURE;
  16.  
  17.   printf("Linea: %s", p);
  18.   free(p);
  19.  
  20.   return EXIT_SUCCESS;
  21. }
En este caso no se requiere de "sizeof *p" ya que es igual a "sizeof(char)" y este siempre es igual a uno.

En cuanto al ultimo programa (para practicar con uniones) tiene varios errores, el principal que se utiliza la unión como si fuera una estructura. Aquí lo mejor es conseguir (y seguir) un buen libro. Recomendaciones sobre ellos en uno de los temas fijos.

Un saludo
En línea

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
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #14 en: 27 Julio 2011, 04:09 am »

En C la conversión explicita no es necesaria y no se recomienda, en este lenguaje el idioma (convención informal) para reservar memoria es:
Código
  1. p = malloc(N * sizeof *p);
Donde N es el numero de elementos.

En tus programas (me refiero a Triper0) sigues con el mismo error que ya te mencionaron: reservas memoria para "sizeof(algun_puntero)" cuando el tamaño debería indicar el tamaño del objeto apuntado. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LONG_MAX_LINEA  1024
  5.  
  6. int main(void)
  7. {
  8.   char *p;
  9.  
  10.   if ((p = malloc(LONG_MAX_LINEA)) == NULL)
  11.      return EXIT_FAILURE;
  12.  
  13.   puts("Introduce una linea de texto:");
  14.   if (fgets(p, LONG_MAX_LINEA, stdin) == NULL)
  15.      return EXIT_FAILURE;
  16.  
  17.   printf("Linea: %s", p);
  18.   free(p);
  19.  
  20.   return EXIT_SUCCESS;
  21. }
En este caso no se requiere de "sizeof *p" ya que es igual a "sizeof(char)" y este siempre es igual a uno.

En cuanto al ultimo programa (para practicar con uniones) tiene varios errores, el principal que se utiliza la unión como si fuera una estructura. Aquí lo mejor es conseguir (y seguir) un buen libro. Recomendaciones sobre ellos en uno de los temas fijos.

Un saludo


Ese "N se refiere a número de elementos" cómo sería?... Por ejemplo, si yo tengo un puntero de tipo int, sería N=1
Y si tengo un char *nombre[10] sería N=10... ¿Así?

El tema de las uniones, seguramente tenga millones de errores, NUNCA use una unión, y justo vi un ejercicio sólo de unión, leí que era parecido a el struct pero no le encuentro la diferencia...
El libro que leí todo y seguí paso a paso, que fue uno de los que me recomendaron en la cátedra fue "C con ejemplos"...
Explica muy bien todo, pero no llega a cosas "muy avanzadas" como listas que es algo de lo cual necesito saber bien porque estoy seguro que en el parcial me van a tomar eso, además de obvio, para aprender más...

Desde ya muchísimas gracias también por el ejemplo y por todo ;)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #15 en: 27 Julio 2011, 04:36 am »

Ese "N se refiere a número de elementos" cómo sería?... Por ejemplo, si yo tengo un puntero de tipo int, sería N=1
Y si tengo un char *nombre[10] sería N=10... ¿Así?
No.

El numero de elementos que piensas utilizar. Por ejemplo si necesitas espacio para una cantidad N de enteros (determinado en tiempo de ejecución) utilizas (sin validación para que sea mas sencillo):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int *p;
  7.   int num_elem;
  8.   int i;
  9.  
  10.   printf("Indica el numero de elementos: ");
  11.   fflush(stdout);
  12.   scanf("%d", &num_elem);
  13.  
  14.   /* Reserva de memoria */
  15.   p = malloc(num_elem * sizeof *p);
  16.  
  17.   /* Lectura de datos */
  18.   for (i = 0; i < num_elem; i++){
  19.      printf("p[%d] == ", i);
  20.      fflush(stdout);
  21.      scanf("%d", p + i); /* Equivalente a "&p[i]" */
  22.   }
  23.  
  24.   /* Algun proceso de datos ... */
  25.  
  26.   /* Liberacion de memoria y salida del programa */
  27.   free(p);
  28.   return EXIT_SUCCESS;
  29. }

Un saludo
En línea

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
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #16 en: 27 Julio 2011, 05:26 am »

No.

El numero de elementos que piensas utilizar. Por ejemplo si necesitas espacio para una cantidad N de enteros (determinado en tiempo de ejecución) utilizas (sin validación para que sea mas sencillo):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int *p;
  7.   int num_elem;
  8.   int i;
  9.  
  10.   printf("Indica el numero de elementos: ");
  11.   fflush(stdout);
  12.   scanf("%d", &num_elem);
  13.  
  14.   /* Reserva de memoria */
  15.   p = malloc(num_elem * sizeof *p);
  16.  
  17.   /* Lectura de datos */
  18.   for (i = 0; i < num_elem; i++){
  19.      printf("p[%d] == ", i);
  20.      fflush(stdout);
  21.      scanf("%d", p + i); /* Equivalente a "&p[i]" */
  22.   }
  23.  
  24.   /* Algun proceso de datos ... */
  25.  
  26.   /* Liberacion de memoria y salida del programa */
  27.   free(p);
  28.   return EXIT_SUCCESS;
  29. }

Un saludo

Ahahaha, fenómeno!!!...
Millón de gracias nuevamente  ;-)
En línea

alesurf1989

Desconectado Desconectado

Mensajes: 1


Hi Smurf!


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #17 en: 8 Noviembre 2015, 21:34 pm »

estoy igual que el amigp! soy un programador novato! tengo problemas con algun for! me sale el errror violacion de segmento core generado! se que el problema debe estar en algun for que se esta saliendo del espacio y esta tocando la memoria o algo asi fue que me explicaron y he dado vueltas y nada que he podido resolver!!!! gracias espero una respuesta!!!!!
 para la ayuda de un buen samaritano y programador!















#include <stdio.h>
#include <time.h>
//Bienvenido al juego tres en raya

void loop (char c[3][3]);
void Intro_Primera (char c[3][3]);
void tablero  (char c[3][3]); // tablero para mostrar en pantalla
void Intro_Yo (char c[3][3]); //turno del jugador o usuario
void Intro_IA (char c[3][3]); //turno aleatorio o computadora
int  ganador  (char c[3][3]); //funcion para determinar quuien gana

int main () {

    char c [3][3];
         
    loop (c);
   
   system ("pause");
   return 0;
   
}
   
void loop (char c [3][3]){
   int i, j;
   
   i = 0;
   
   Intro_Primera (c);
   tablero(c);
   
   do{
       system ("cls");
       tablero(c);
       
       if (i % 2 == 0) {
          Intro_Yo (c);
       }
       else {
             Intro_IA (c);
             }
             j = ganador (c);             
             i++;
   
   }while (i <= 9 && j == 2);
   
   if (j == 0){
     printf ("Muy Bien!! Has ganado!!\n\n");
     }
     else if (j == 1){
           printf ("ohhh noo!! Has perdido!!");
           }
           else{
                printf ("Has empatado!! Intentalo de nuevo!!");
     
   }
}

void Intro_Primera (char c[3][3]){
   int i, j;
   char aux;
   
   aux='1';
   
   for (i = 0; 1 < 3; i++){
       for (j = 0; j < 3; j++){
          c[j] = aux++;
       }
   }
}

void Intro_Yo(char c[3][3]){
  int i, j, k;
  char aux;
 
     
    do{
       do{
        printf ("Coloca una ficha:  ");
        fflush (stdin);
        scanf ("%c",&aux);
        }while (aux < '1' || aux > '9');
       
         k = 0;
       
      switch (aux){
         case '1': {
                 i = 0;
                 j = 0;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                      break;                 
                 }     
                 
         case '2': {
                 i = 0;
                 j = 1;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                     break;                 
                 }
         case '3': {
                 i = 0;
                 j = 2;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                     break;                 
                 }           
         case '4': {
                 i = 1;
                 j = 0;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                      break;                 
                 }   
         case '5': {
                 i = 1;
                 j = 1;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                     break;                 
                 }     
         case '6': {
                 i = 1;
                 j = 2;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                     break;                 
                 }     
         case '7': {
                 i = 2;
                 j = 0;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                      break;                 
                 }     
         case '8': {
                 i = 2;
                 j = 1;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                     break;                 
                 }     
         case '9': {
                 i = 2;
                 j = 2;
                    if (c[j] == 'X' || c[j] == 'O'){
                     k = 1;
                     printf ("la posicion esta ocupada! Intentalo con otro numero!!\n\n");
                 }
                      break;                 
                 }     
        }
    }while (k == 1);
   
    c[j] = 'X';
   
}

void Intro_IA (char c[3][3]){
     int i, j, k;
     
     
     srand (time(NULL));
     do{
         
    i = rand() % 3;
    j = rand() % 3;
    k = 0;
   
     if (c[j] == 'X' || c[j] == 'O'){
         k = 1;
         }
   }while (k == 1);
   
    c[j] = 'O';
}

void tablero (char c[3][3]){
  int i, j;
 
  for (i = 0; 1 < 3; i++){
       for ( j = 0; j < 3; j++){
          if (j < 2){
                printf (" %c  |",c[j]);
          }   
            else {
                  printf (" %c ",c[j]);
            }
       }     
       if (i < 2){
          printf ("\n-----------\n");       
       }
  }
  printf ("\n\n");


int ganador (char c[3][3]){
    if (c[0][0] == 'X' || c[0][0] == 'O'){
        if (c[0][0] == c[0][1] && c[0][0] == c[0][2]){
           if (c[0][0] == 'X'){
                     return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }
        if (c[0][0] == c[1][0] && c[0][0] == c[2][0]){
            if (c[0][0] == 'X'){
                 return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }       
    }
   
        if (c[1][1] == 'X' || c[1][1] == 'O'){
       if (c[1][1] == c[0][0] && c[1][1] == c[2][2]){
        if (c[1][1] == 'X'){
                 return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        } 
        if (c[1][1] == c[1][0] && c[1][1] == c[1][2]){
            if (c[1][1] == 'X'){
                 return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }     
             if (c[1][1] == c[2][0] && c[1][1] == c[0][2]){
                if (c[1][1] == 'X'){
                 return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }
          if (c[1][1] == c[0][1] && c[1][1] == c[2][1]){
            if (c[1][1] == 'X'){
                 return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }                   
    }
    if (c[2][2] == 'X' || c[2][2] == 'O'){
       if(c[2][2] == c[2][0] && c[2][2] == c[2][1]){
          if (c[2][2] == 'X'){
                    return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }                   
       if (c[2][2] == c[0][2] && c[2][2] == c[1][2]){
          if (c[2][2] == 'X'){
                     return 0; //ha ganado
               }
               else{
                     return 1; // ha perdido
            }         
        }   
   }
   return 2;   
}
En línea

Un paso firme es un gran escalón para seguir adelante!
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
calculadora en lenguaje ensamblador ¨violacion de segmento¨
ASM
larapam 2 6,401 Último mensaje 12 Mayo 2012, 18:58 pm
por CasiqueCasimiro
Violacion de segmento en producto de matrices
Programación C/C++
forakas 2 3,360 Último mensaje 28 Diciembre 2012, 04:53 am
por durasno
problema con una violacion de segmento usando opcodes « 1 2 »
Programación C/C++
Belial & Grimoire 10 7,389 Último mensaje 2 Septiembre 2013, 11:02 am
por Eternal Idol
ayuda violacion de segmento?
Programación General
nightcode 7 4,380 Último mensaje 31 Diciembre 2013, 18:32 pm
por nightcode
Violación de Segmento
Programación C/C++
Jaquieline_JJ 1 2,250 Último mensaje 24 Abril 2014, 04:11 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines