Foros del Web » Programación para mayores de 30 ;) » C/C++ »

se puede hacer esto en C

Estas en el tema de se puede hacer esto en C en el foro de C/C++ en Foros del Web. hola gente: bueno, estoy aprendiendo a programar en lenguaje C, y estoy haciendo un trabajo para la facu... y tengos problemas al hacer esto: " ...
  #1 (permalink)  
Antiguo 05/04/2006, 07:11
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
se puede hacer esto en C

hola gente:

bueno, estoy aprendiendo a programar en lenguaje C, y estoy haciendo un trabajo para la facu... y tengos problemas al hacer esto:

" idAgr = tda->comando[i].id; "

donde idAgr e id son int, y la estructura que use es :

"
typedef struct Tcomandos {
int id;
char nombre[CARACTERES];
char params[CARACTERES];
}Tcomandos;

typedef struct TDA_ValCmd {
Tcomandos comando[max];
}TDA_ValCmd;

"

yo lo que quiero es asignarle a ese idAgr el valor de id de esa estructura, puse banderas por todo el programa y pude ver que de ahi viene la falla, que esta mal?

espero puedan ayudarme



ah, estoy programando en Dev-c++
  #2 (permalink)  
Antiguo 05/04/2006, 07:13
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
El código está bien (y te compilará), si falla, es por causas externas, lo más normal, que estés jugando mal con los punteros.

Pero ahí no te podemos ayudar si no es viendo todo el código y depurando la aplicación.
  #3 (permalink)  
Antiguo 05/04/2006, 07:31
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
bueno pongo el codigo para que puedan ayudarme mejor, estaba separado pues es para hacer un tda, y lo uni todo aca, por si hay algun error de ese tema....


Código:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define INICIO "0"
#define DEST "1"

typedef struct Tcomandos {
    int id;
    char nombre[CARACTERES];
    char params[CARACTERES];
}Tcomandos;

typedef struct TDA_ValCmd {
    Tcomandos comando[max];
}TDA_ValCmd;


void mostrar_menu(void);
int seleccion(void);

//Declaracion Primitivas Privadas
void inicializar_cmd(Tcomandos* comando);

void destruir_cmd(Tcomandos* comando);

void setId(TDA_ValCmd* tda, int pos, int id);

void setNom(TDA_ValCmd* tda, int pos, const char* nombre);

void setParam(TDA_ValCmd* tda, int pos, const char* parametro);

int getId(TDA_ValCmd* tda, int pos);

char* getNom(TDA_ValCmd* tda, int pos);

char* getParam(TDA_ValCmd* tda, int pos);

int vacio(TDA_ValCmd* tda);

void buscarPosId(TDA_ValCmd* tda, int id, int *pos, int *error);

//Implementacion Primitivas Publicas
int ValCmd_crear(TDA_ValCmd* tda)
{
    Tcomandos comando[max];
    
    inicializar_cmd(comando);
    printf("en crear Comando[3].id = %d\n",comando[3].id);
    printf("en crear Comando[3].nombre = %s\n",comando[3].nombre);
    printf("en crear Comando[3].params = %s\n",comando[3].params);
    tda =(TDA_ValCmd * )malloc(sizeof(TDA_ValCmd));
    if (tda == NULL)
         return 0; // no hubo espacio en memoria
    else return 1; // hubo espacio en memoria
}

int ValCmd_agregar_def_cmd(TDA_ValCmd* tda, int id, char* nombre, char* params)
{
    int i=0, idAgr=0;
    printf("voy a obtuvener el id\n"); system("pause");
    printf("tda->comando[0].id = %d\n", tda->comando[i].id);system("pause");
    idAgr = tda->comando[i].id;
    printf("obtuvo el id\n"); system("pause");
    // busco el 1er lugar que este vacio e inserto al final
    // i < mas es l rango para que i no se pase si el vector esta lleno
    /* el idAgr debe ser distinto a id, ya que el id debe ser unico, entonces si
     son iguales devuelve 0 */
     
     while (( idAgr!=0) && (i < max) && (idAgr!=id))
     {
         i++;
         if (i == max) // si esta lleno
                  return 0; // no se pudo crear
         idAgr = tda->comando[i].id;
     }
     if (idAgr == id) // si ese id ya existe
          return 0; // no se pudo crear
    else
    {
        setId(tda, i, id);
        setNom(tda, i, nombre);
        setParam(tda,i, params);
    }
    return 1; // se pudo crear
}

int ValCmd_obtener_def_cmd(TDA_ValCmd* tda, int id, char* nombre, char* params)
{
    int error;
    int pos;
    if (!vacio(tda)) // si el tda no esta vacio
    {
        buscarPosId(tda, id, &pos, &error); // busca la posicion del id
        if (error == 0) // si no hubo error
        {
            nombre = getNom(tda, pos);
            params = getParam(tda, pos);
        }
        else return 0; // no se pudo obtener el id     
    }
    else return 0; // no se pudo obtener el id
    return 1; // se pudo obtener el id
}

int ValCmd_obtener_id_cmd (TDA_ValCmd* tda,int id, char* nombre)
{
    int pos;
    char* nomEnc;
     
    if(!vacio(tda))
    {
        pos = 0;
         do {
           nomEnc = getNom(tda,pos);
           if (nomEnc==nombre) 
              { id=getId(tda,pos);
                 return 1;}
           else if (pos < max) pos++;
           }    
         while ((pos<=max)&&(nomEnc!=nombre));
         if (nomEnc!=nombre) return 0;
        } else return 0;
}  

int Val_Cmd_borrar_def_cmd(TDA_ValCmd* tda,int id)
{
    int pos;
    int IdEnc; 
    
    if(!vacio(tda))
      {pos=0;
       do 
         {IdEnc = getId(tda,pos);
           if (IdEnc == id )
              {setId(tda,pos,-1);
               setNom(tda,pos,INICIO);
               setParam(tda,pos,INICIO);
               return 1;}
           else if (pos < max) pos++;
          }    
        while ((pos <= max)&&(IdEnc!=id));
        if (IdEnc!=id) return 0;
       } else return 0;
}




void ValCmd_destruir(TDA_ValCmd* tda)
{
    Tcomandos comando[max];
    
    destruir_cmd(comando);
    printf("en destruir Comando[3].id = %d\n",comando[3].id);
    printf("en crear Comando[3].nombre = %s\n",comando[3].nombre);
    printf("en crear Comando[3].params = %s\n",comando[3].params);
    free(tda);
}

// Implementacion Primitivas Privadas by Cristian                        

void inicializar_cmd(Tcomandos* comando)
{
    int i;
    for (i=0; i<=max; i++)
    {
        comando[i].id=0;
        strcpy(comando[i].nombre,INICIO);
        strcpy(comando[i].params,INICIO);
    }    
} 

void destruir_cmd(Tcomandos* comando)
{
    int i;
    for(i=0; i<=max; i++)   
    {
        comando[i].id=-1;
        strcpy(comando[i].nombre,DEST);
        strcpy(comando[i].params,DEST);
    }
}        
        
void setId(TDA_ValCmd *tda, int pos, int id)
{
    tda->comando[pos].id = id;
}

void setNom(TDA_ValCmd* tda, int pos, const char* nombre)
{
    strcpy (tda->comando[pos].nombre, nombre);
}

void setParam(TDA_ValCmd* tda, int pos, const char* parametro)
{
    strcpy(tda->comando[pos].params, parametro);
}

int getId(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].id);
}

char* getNom(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].nombre);
}

char* getParam(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].params);
}

int vacio(TDA_ValCmd* tda)
{
    char *nombre;
    char *parametro;
    int id;
    
    id = getId(tda, 0);
    nombre = getNom(tda, 0);
    parametro = getParam(tda, 0);
    if ( (id == -1) && (nombre == INICIO) && (parametro == INICIO) )
        return 1;
    else return 0;
}

void buscarPosId(TDA_ValCmd* tda, int id, int *pos, int *error)
{
    int i=0, idbuscar;
    int encontrado=0;
    *error = 0; // falso
    idbuscar = getId(tda, i);
    if ( idbuscar == id) // si el primero es el id que buscaba
        encontrado = 1; // true
    // busco el id en caso que no sea el primero
    while ((i<max) && (encontrado == 0))
    {
        i++;
        // me fijo si se paso del rango
        if (i != max)
        {
            idbuscar = getId(tda, i);
            if (idbuscar == id) // si lo encuentra    
               encontrado = 1; // true
        }
        else
            *error = 1; // no existe el id a buscar (se paso de rango)
    }
    if ((encontrado == 1) && (*error == 0)) 
        *pos = i;
}


int main(int argc, char* argv[])
{
    TDA_ValCmd *tda;
    
    char nombre[CARACTERES], params[CARACTERES];
    int id, fin = 0, creado = 0, idAgr, i=0;
    int agregado = 0;
    
    
    
    creado = ValCmd_crear(tda);
    if (creado == 1) // si se pudo crear
    {
        while ( fin == 0)
        {
            mostrar_menu();
            switch (seleccion())
            {
                case 1: 
                        printf(" Ingrese el Id del Comando: \n");
                        scanf("%d", &id);
                        printf(" Ingrese el Nombre del Comando: \n");
                        scanf("%s", nombre);
                        printf(" Ingrese los Parametros del Comando: \n");
                        scanf("%s", params);
                        
                        /*agregado = ValCmd_agregar_def_cmd(tda, id, nombre, params);
                        if(agregado == 1) 
                             printf(" El comando ha sido correctamente agregado\n");
                        else printf(" Error al agregar el comando\n");*/
                        
        /*********** ACA VIENE EL PROBLEMA *****************/               
                        idAgr = tda->comando[i].id;
                         while (( idAgr!=0) && (i <= max) && (idAgr!=id))
                         {
                               i++;
                               if (i == max) // si esta lleno
                                  printf("no se pudo crear\n"); // no se pudo crear
                               idAgr = tda->comando[i].id;
                         }
                         if (idAgr == id) // si ese id ya existe
                            printf("no se pudo crear\n"); // no se pudo crear
                         else
                         {
                             tda->comando[i].id = id;
                             strcpy (tda->comando[i].nombre, nombre);
                             strcpy(tda->comando[i].params, params);;
                         }
                        
                        break;
                case 2: printf("No disponible aun\n");
                        break;
                case 3: printf("No disponible aun\n"); break;
                case 4: fin = 1; break;
                default: printf(" Opcion no valida\n");break;
            }
        }
        ValCmd_destruir(tda);    
    }// fin if     
    // en caso de que no ha sido creado
    else printf("El validador no se pudo crear \n"); 
    
    system ("pause");
    return 0;
}    

void mostrar_menu(void)
{
     printf("-------------------------------------------\n");
     printf("|               Menu                      |\n");
     printf("-------------------------------------------\n");
     printf("|  1 - Agragar una definicion de comando  |\n");
     printf("|  2 - Eliminar una definicion de comando |\n");
     printf("|  3 - Validar una sentencia              |\n");
     printf("|  4 - Salir del programa                 |\n");
     printf("-------------------------------------------\n");
}

int seleccion(void)
{
    int op =0;
    printf("|  Ingrese una opcion y luego <ENTER>     |\n");
    printf("-------------------------------------------\n");
    scanf("%d",&op);
    return (op);
}
  #4 (permalink)  
Antiguo 05/04/2006, 07:33
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Lo siento dudo mucho que alguien de aquí tenga tiempo de depurar tal cantidad de código.

Una cosa, ¿para qué usas la #include<conio.h>?
  #5 (permalink)  
Antiguo 05/04/2006, 07:50
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
Cita:
Iniciado por MaxExtreme
Lo siento dudo mucho que alguien de aquí tenga tiempo de depurar tal cantidad de código.
Si es verdad. Pero bueno lo que queria saber era lo de ese "idAgr = tda->comando[i].id;" pero si me decis que esta bien, me fijare otra cosa... pero justo se cualga ahi... me fijare como le estoy pasando el puntero.

Gracias MaxExtreme por tu respuesta, y tan rapida

Cita:
Iniciado por MaxExtreme
Una cosa, ¿para qué usas la #include<conio.h>?
lo usaba para el clrscr, pero no anda en win y me olvide de sacarlo.

  #6 (permalink)  
Antiguo 05/04/2006, 09:01
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Cita:
Iniciado por ariattaquero
Si es verdad. Pero bueno lo que queria saber era lo de ese "idAgr = tda->comando[i].id;" pero si me decis que esta bien, me fijare otra cosa... pero justo se cualga ahi... me fijare como le estoy pasando el puntero.

Gracias MaxExtreme por tu respuesta, y tan rapida :
El problema no es que el código esté mal escrito, sino que ya funcionando, cuando tratas de acceder ahí, no es un lugar de memoria válido (el programa trata de leer esa memoria) y el sistema le debe bloquear.

El problema en concreto puede ser en -> o en [i].

Mirando un poco por encima, he visto bastantes desastres:
1. No veo definido a "max".
2. En los bucles como "for(i=0;i<=max;i++)" te estás colando 1 posición de más en la memoria, los arrays van de 0 a max-1, no a max. Por tanto, "<", nunca "<=".
3. Para crear un "tda" o "destruirlo", crear un "comando" y llamas a otra función. Pero si la función es para las TDA, para que haces...

Código:
Tcomandos comando[max];
destruir_cmd(comando);
4.. y las que queden.
  #7 (permalink)  
Antiguo 05/04/2006, 19:42
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
Cita:
Iniciado por MaxExtreme
El problema en concreto puede ser en -> o en [i].
sip, porque el programa se cualga al hacer:
idAgr=tda->comando[i].id; por ejemplo.

asi que voy a revisar esa reserva de memoria, que la devo estar haciendo mal. SEGURO

En cuanto a los otros puntos algunas tienen su explicacion, la 3 voy a revisar


Gracias nuevamente MaxExtreme, por tomarte el tiempo de revisar.
Saludos
  #8 (permalink)  
Antiguo 06/04/2006, 02:37
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
De nada, si posteas otro código con esos fallos corregidos volveré a echar otro vistazo.
  #9 (permalink)  
Antiguo 06/04/2006, 05:56
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
Gracias de nuevo.
Lo que voy a revisar son los punteros, puede que de ahi tambien venga el problema, le devo estar pasando mal los punteros a las funciones.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:20.