Пропустить реализацию списка в C - PullRequest
0 голосов
/ 17 октября 2018

Я реализую список пропуска в C. Однако, функция skiplist_insert не работает.TaskArray в узле, который вставлен в список, не имеет правильных задач.Я действительно не могу понять, почему.Может ли кто-нибудь указать мне правильное направление?Я застрял в этом в течение нескольких дней.

Оригинальная реализация найдена здесь .Функция malloc заменена на OSMemCreate и OSMemGet, поскольку она будет использоваться в ОС реального времени, которая не позволяет использовать malloc.

Вот как я использую код (для простоты урезан):

skiplist_init(&rTaskList);
task recTask = {(period+tickCnt) % MAXTICKCNT,
                  overflow,
                  TCB,
                  name,
                  taskptr,
                  prio,
                  stk,
                  stksize};
  arr.count = 1;

  arr.tasks=&recTask;

  skiplist_insert(rTaskList, 0, arr);

Это сама реализация

typedef struct task{
  CPU_INT16U period;
  CPU_INT08U overflow_flag;
  OS_TCB * TCB;
  CPU_CHAR * name;
  OS_TASK_PTR taskptr;
  OS_PRIO prio;
  CPU_STK * stk;
  CPU_STK_SIZE stksize;
}task;

typedef struct taskArray{
  CPU_INT32U count;
  task * tasks;
}taskArray; 

typedef struct snode {
    int key;
    taskArray arr;
    OS_MEM  *  MyPartitionPtr;
    OS_MEM * ForwardPartitionPtr;
    struct snode **forward;
} snode;

typedef struct skiplist {
    int level;
    struct snode *header;
} skiplist;

skiplist *skiplist_init(skiplist *list) {
    int i;
    OS_ERR  err;
    CPU_INT08U   MyPartitionStorage[12][100];  
    CPU_INT08U   MyPartitionStorage2[12][100]; 
    OS_MEM      MyPartition; 
    OS_MEM      ForwardPartition;
    // Memory management       
    OSMemCreate((OS_MEM    *)&MyPartition, 
                (CPU_CHAR  *)"My Partition",           
                (void      *)&MyPartitionStorage[0][0],                      
                (OS_MEM_QTY ) 12,                            
                (OS_MEM_SIZE)100,                            
                (OS_ERR    *)&err);


    snode *header = (snode *)OSMemGet((OS_MEM    *)&MyPartition,
                                      (OS_ERR    *)&err);

    list->header = header;
    header->key = INT_MAX;
    header->MyPartitionPtr = &MyPartition; // update mem ptr

    // Replace malloc function
    OSMemCreate((OS_MEM    *)&ForwardPartition,                 
                (CPU_CHAR  *)"My Partition",           
                (void      *)&MyPartitionStorage2[0][0],                      
                (OS_MEM_QTY ) 12,                            
                (OS_MEM_SIZE)100,                            
                (OS_ERR    *)&err);

    header->forward = (snode **)OSMemGet((OS_MEM    *)&ForwardPartition,
                                          (OS_ERR    *)&err);
    if (err != OS_ERR_NONE){
      true; // for catching memory allocation errors
    }
    header->ForwardPartitionPtr = &ForwardPartition; // update mem ptr

    for (i = 0; i <= SKIPLIST_MAX_LEVEL; i++) {
        header->forward[i] = list->header;
    }

    list->level = 1;

    return list;
}

static int rand_level() {
    int level = 1;
    while (rand() < RAND_MAX / 2 && level < SKIPLIST_MAX_LEVEL)
        level++;
    return level;
}

int skiplist_insert(skiplist *list, int key, taskArray arr) {
    OS_ERR  err;
    OS_MEM    MyPartition;
    OS_MEM      ForwardPartition;
    CPU_INT08U   MyPartitionStorage[12][100];  
    CPU_INT08U   MyPartitionStorage2[12][100]; 

    snode *update[SKIPLIST_MAX_LEVEL + 1];
    snode *x = list->header;
    int i, level;
    for (i = list->level; i >= 1; i--) {
        while (x->forward[i]->key < key)
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[1];

    if (key == x->key) {
        x->arr = arr;
        return 0;
    } else {
        level = rand_level();
        if (level > list->level) {
            for (i = list->level + 1; i <= level; i++) {
                update[i] = list->header;
            }
            list->level = level;
        }

    //Mem alloc                       
    OSMemCreate((OS_MEM    *)&MyPartition,                 
                (CPU_CHAR  *)"My Partition",           
                (void      *)&MyPartitionStorage[0][0],                      
                (OS_MEM_QTY ) 12,                            
                (OS_MEM_SIZE)100,                            
                (OS_ERR    *)&err);

    x = (snode *)OSMemGet((OS_MEM    *)&MyPartition,
                                      (OS_ERR    *)&err);



    x->key = key;
    x->arr = arr;
    x->MyPartitionPtr = &MyPartition; // update ptr

    // replace malloc function       

    OSMemCreate((OS_MEM    *)&ForwardPartition,                 
                (CPU_CHAR  *)"Forward Partition",           
                (void      *)&MyPartitionStorage2[0][0],                      
                (OS_MEM_QTY ) 12,                            
                (OS_MEM_SIZE)100,                            
                (OS_ERR    *)&err);


    x->forward = (snode **)OSMemGet((OS_MEM    *)&ForwardPartition,
                                        (OS_ERR    *)&err);

    x->ForwardPartitionPtr = &ForwardPartition;
    for (i = 1; i <= level; i++) {
        x->forward[i] = update[i]->forward[i];
        update[i]->forward[i] = x;
    }
  }
    return 0;
}
...