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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Ayuda - Punteros-malloc- en: 16 Marzo 2019, 01:05 am
Hola! necesito que alguien me ayude a entender porque no esta funcionando mi función.
estoy programando una librería en C y necesito hacer un "árbol" de distintas estructuras, donde los nodos tengas interrelación.
Esto lo programe en el IDE Codeblocks, donde los compile y debuggie (anduvo perfectamente)
Luego pase al IDE de Arduino y lo programe ahi, nunca pudo ejecutar mas de 14/17 repeticiones de la función (lo chequee con el puerto serie, imprimiendo en cada iteracion)
pensé qe tal vez al arduino uno(atmega 328) no le daba para ejecutar, asiq pase a una placa de desarrollo que tiene un PIC32mx764F128L, una bestia pero tampoco pasa la función :-\

el código qe paso es solo la parte que se "tilda" la función tiene mas lineas. no creo que haga falta, pero si alguien necesita lo paso.
ultima aclaración, hice la iteracion esa a la fuerza (1300 lineas de código) y lo ejecuta perfectamente, arduino uno, la placa de desarrollo, codeblocks..todo.

extern  struct io_type    *e, *s,*aux_io;     // Entradas y salidas
extern  struct mf_type    *mf1, *aux_mf;      // Funciones de membresia p/entrada 1
extern  struct mf_type    *mf2;               // Funciones de membresia p/entrada 2
extern  struct mf_type    *mf3;               // Funciones de membresia p/entrada 3
extern  struct mf_type    *mf0;               // Funciones de membresia p/salida 1
extern  struct rule_type  *Rule_Base;         // Puntero a la base de la lista de reglas
extern  struct rule_type  *rule;             // Reglas del sistemas
extern  struct rule_element_type  *aux_ret;
extern  int rangos[NUM_ENTRADAS][2];


/*Reglas*/
    int R[NUM_REGLAS][4] =
                          {
                            {0,0,4,1},  //1
                            {1,0,0,1},  //2
                            {2,1,0,1},  //3
                            {2,2,0,1},  //4
                            {2,3,0,1},  //5
                            {2,4,0,1},  //6
                            {2,5,1,2},  //7
                            {2,5,2,2},  //8
                            {2,5,3,2},  //9
                            {3,1,0,1},  //10
                            {3,2,0,1},  //11
                            {3,3,0,1},  //12
                            {3,4,3,2},  //13
                            {3,4,2,2},  //14
                            {3,4,1,1},  //15
                            {3,5,3,2},  //16
                            {3,5,2,2},  //17
                            {3,5,1,2},  //18
                            {4,1,0,1},  //19
                            {4,2,0,1},  //20
                            {4,3,3,2},  //21
                            {4,3,2,1},  //22
                            {4,3,1,1},  //23
                            {4,4,3,2},  //24
                            {4,4,2,2},  //25
                            {4,4,1,1},  //26
                            {4,5,3,2},  //27
                            {4,5,2,2},  //28
                            {4,5,1,2},  //29
                            {5,1,0,1},  //30
                            {5,2,0,1},  //31
                            {5,3,3,2},  //32
                            {5,3,2,2},  //33
                            {5,3,1,2},  //34
                            {5,4,3,2},  //35
                            {5,4,2,2},  //36
                            {5,4,1,2},  //37
                            {5,5,3,2},  //38
                            {5,5,2,2},  //39
                            {5,5,1,2}   //40
                        };

    Rule_Base = malloc(sizeof(struct rule_type));     //Alojo memoria para la base de la lista de reglas
    rule = Rule_Base;   //para no perder el puntero a la base, copio la direccion
    for( i = 0; i < NUM_REGLAS ; i++ )
    {
      rule->if_side = malloc(sizeof(struct rule_element_type));
      aux_ret = rule->if_side;
      //Error
      if( R
  • !=0) //chequeo si en la regla "i" el error es parte de la regla
     {
        j = 1;
        for(aux_mf=mf1; aux_mf != NULL; aux_mf=aux_mf->next) // recorro las mf
        {
          if( j == R
  • )  // Cuando encuentro la mf que me interesa, le asigno el valor
         {
            aux_ret->value = &(aux_mf->value);
          }
          j++;
        }
        if(( R [1] != 0) || (R[2] != 0))  // chequeo si hay mas antecedentes
        {
          aux_ret->next = malloc(sizeof(struct rule_element_type)); //asigno memoria para el proximo antecedente
          aux_ret = aux_ret->next;
        }
      }
      //Derivada de la temperatura
      if(R[1] !=0) //chequeo si en la regla "i" la dT/dt es parte de la regla
      {
        j = 1;
        for(aux_mf=mf2; aux_mf != NULL; aux_mf=aux_mf->next)
        {
          if(j == R[1])
          {
            aux_ret->value = &(aux_mf->value);
          }
          j++;
        }
        if(R[2] != 0) // chequeo si hay mas antecedentes
        {
          aux_ret->next = malloc(sizeof(struct rule_element_type));
          aux_ret = aux_ret->next;
        }
      }
      //Condicionante
      if(R[2] !=0) //chequeo si en la regla "i" el condicionante es parte de la regla
      {
        j = 1;
        for(aux_mf=mf3; aux_mf != NULL; aux_mf=aux_mf->next)
        {
          if(j == R[2])
          {
            aux_ret->value = &(aux_mf->value);
          }
          j++;
        }
      }
      aux_ret->next = NULL; // como no hay mas antecedentes, termino la lista if_side
      rule->then_side = malloc(sizeof(struct rule_element_type)); //Asigno memoria para los concecuentes
      aux_ret = rule->then_side;
      //Salida
      aux_mf = mf0;
      if(R[3] == 1) //Cerrado
      {
          aux_ret->value = &(aux_mf->value);
      }
      else            //Abierto
      {
          aux_mf = mf0->next;
          aux_ret->value = &(aux_mf->value);
      }
      aux_ret->next = NULL; //Como no hay mas salidas, se termina la lista.
      if( i != (NUM_REGLAS-1)) //chequeo si se escribieron todas las reglas
      {
        rule->next = malloc(sizeof(struct rule_type));  //aloco memoria para la siguiente regla
        rule = rule->next;
      }
      else{rule->next = NULL;} //Como no hay mas reglas, finaliza la función.
    }
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines