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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


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

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Problema en ejecucion
« en: 18 Noviembre 2013, 19:17 pm »

Tengo el siguiente codigo que me compila pero no me ejecuta, me gyustraria que me dijeran cual es el error

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define STACKSIZE 50

struct stack_struct{
       unsigned int size_algo;
       int tipo[STACKSIZE];
};

typedef struct stack_struct stack;
 
stack * crear_stack_corchete (){
      stack * corchete;
      stack l_corchete;
      corchete=&l_corchete;                                   /
      corchete->size_algo = 0;
      return corchete;
   }

stack * crear_stack_llave(){
      stack * llave;
      stack l_llave;
      llave=&l_llave;            
      llave->size_algo = 0;
      return llave;
   }
stack * crear_stack_parentesis(){
      stack * parentesis;
      stack l_parentesis;   
      parentesis=&l_parentesis;         
      parentesis->size_algo=0;
      return parentesis;
   }

void balancear(stack *parentesis, stack *corchete,stack *llave, char tipo, int linea){ 
     if ((int)tipo==40){
        parentesis->tipo[parentesis->size_algo++]=linea;     
        }
     if ((int)tipo==91){
        corchete->tipo[corchete->size_algo++]=linea;
     }
     if ((int)tipo== 123){
        llave->tipo[llave->size_algo++]=linea;
     }
     if ((int)tipo== 41){
        if (parentesis->size_algo <1){
           printf ("Error: Caracter ) no balanceado en la linea %d.\n", *parentesis);
        }
        else{
             parentesis->tipo[parentesis->size_algo--];
        }
     }             
     if ((int)tipo==93){
        if (corchete->size_algo<1){
           printf ("Error: Caracter ] no balanceado en la linea %d.\n", *corchete);
        }
        else{
        corchete->tipo[corchete->size_algo--];
        }
     }
     if ((int)tipo==125){
        if (llave->size_algo <1){
           printf ("Error: Caracter } no balanceado en la linea %d.\n", *llave);
        }
        else{
             llave->tipo[llave->size_algo--];
        }
     }
}
                                 
int main(int argc, char* argv[]){
     stack *parentesis=crear_stack_parentesis();               
     stack *corchete=crear_stack_llave();
     stack *llave=crear_stack_corchete();
     unsigned int linea;
     char es_comilla=0;                                                         
     char es_apostrofe=0;
     char caracter;
     FILE* archivo=fopen(argv[1],"r");
     caracter=(char)fgetc (archivo);
     if (archivo==NULL){                                                         
        printf("Error: archivo nulo");
     }
     else{
          while ( caracter != EOF){
                if ((int)caracter== 34){
                   if(es_comilla==1){
                                     es_comilla=0;
                   }
                   else{
                        es_comilla=1;
                          }
                if((int)caracter==39){
                   if (es_apostrofe==1){
                      es_apostrofe=0;
                   }
                   else{
                        es_apostrofe=1;
                   }
                }
                if (!(es_comilla || es_apostrofe)){
                   balancear(&parentesis,&corchete,&llave,caracter,linea);
                }
                if (caracter=='\n'){
                   linea++;
                }
          }
          if (caracter==EOF){
             if (es_comilla==0&& es_apostrofe==0 && parentesis->size_algo==0 && corchete->size_algo==0 && llave->size_algo==0){
                printf("Revision completada sin errores.\n");
             }
             if( es_comilla==1 || es_apostrofe==1){
                 printf("Error: EOF encontrado cuando se esperaba caracter limitador de parentesis o string.\n");
             }
             if (parentesis->size_algo!=0){
                while (parentesis->size_algo>0){
                      printf ("Error: Caracter ( no balanceado en la linea %d.\n", *parentesis);
                      parentesis->tipo[parentesis->size_algo--];
                }
             }
             if (corchete->size_algo!=0){
                while (corchete->size_algo>0){
                      printf("Error: Caracter [ no balanceado en la linea %d.\n", *corchete);
                      corchete->tipo[corchete->size_algo--];
                }
             }
             if (llave->size_algo!=0){
                while (parentesis->size_algo>0){
                      printf("Error: Caracter { no balanceado en la linea %d.\n", *llave);
                      llave->tipo[llave->size_algo--];
                }
             }
             
          }
      }
  }
return 0;
fclose(archivo);     
system ("pause");
}


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema en ejecucion
« Respuesta #1 en: 18 Noviembre 2013, 21:59 pm »

Código
  1. return 0;
  2. fclose(archivo);    
  3. system ("pause");

Debería ser:

Código
  1. fclose(archivo);    
  2. system ("pause");
  3. return 0;

Recuerda que el "return" retorna y termina la función, en este caso, "main". El return se debe poner cuando se acabe la función, o cuando tú quieras que acabe.
Al ponerlo antes que el pause, el programa termina ahí, como si el resto no existiese.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema en ejecucion
« Respuesta #2 en: 19 Noviembre 2013, 02:43 am »

En la función "crear_stack_corchete" retornas la dirección en memoria de una variable local:
Código
  1. stack *crear_stack_corchete()
  2. {
  3.   stack * corchete;
  4.   stack l_corchete;
  5.   corchete = &l_corchete; /* <== */
  6.   corchete->size_algo = 0;
  7.   return corchete; /* <== */
  8. }
No es valido porque la memoria utilizada por todas las variables locales se libera al finalizar la función. Mismo caso con las funciones "crear_stack_llave" y "crear_stack_parentesis".

En la función main no debes convertir el valor de retorno de fgetc (de tipo int) al tipo char:
Código
  1. caracter = (char) fgetc(archivo);
Porque la función fgetc retorna un valor no negativo (el carácter leído) o bien un valor negativo (EOF) para indicar error o fin de archivo. El numero de valores posibles (cualquier carácter, EOF) no es posible almacenarlo en una variable de tipo char (por razones obvias), debe ser int.

Por ultimo si la intención es crear un verificador de sintaxis muy básico (comillas, paréntesis y corchetes balanceados) solo necesitas de una pila.

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema de ejecución
Programación C/C++
blue_net 4 2,595 Último mensaje 24 Julio 2013, 15:11 pm
por blue_net
Problema de ejecución en C
Programación C/C++
Gerardovf78 3 1,929 Último mensaje 25 Junio 2015, 15:50 pm
por ivancea96
Problema de ejecucion de .bat y de scripts
.NET (C#, VB.NET, ASP)
jlewis09 1 1,916 Último mensaje 17 Noviembre 2015, 19:19 pm
por _TTFH_3500
Problema con ejecución de .bat ayuda
Scripting
MC.cover 1 1,975 Último mensaje 12 Enero 2016, 07:45 am
por Eleкtro
problema en ejecucion: ahorcado
Programación C/C++
priskot17 0 1,460 Último mensaje 20 Octubre 2016, 21:14 pm
por priskot17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines