Сделать указатели на функции членов структур в c - PullRequest
0 голосов
/ 08 декабря 2018

Я совершенно нуб, когда работаю с C. Очень слаб с указателями.

Я написал структуру для двоичного дерева поиска.Но когда я пытаюсь получить доступ к нему из кода, он выдает ошибку:

Процесс завершается с действием по умолчанию сигнала 11 (SIGSEGV).Неверные разрешения для сопоставленной области по адресу 0x0`.

Вот моя структура (в bst.h):

typedef struct tree Tree;

typedef struct tree{
    Node * root;
    Data * (*insert)(Tree * bst, Data value); //i get error in main when I make a call
    Data * (*search)(Tree * bst, Data value);
    void (*sort)(Tree *, Data *);
    int (*compare)(Tree *t, Tree * copy);
    Tree * (*clone)(Tree *t);
    void  (*delete)(Tree *bst);
    void  (*removeData)(Tree * bst, Data value);
}Tree;

Функции-члены (в bst.c):

Node * newNode(Data data, Node * parent) {
    printf("inside new node\n");
    Node * node = malloc(sizeof(Node));
    if(parent!=NULL) {
        if((parent->data.value)> data.value) {
            parent->left=node;
        }
        else {
            parent->right=node;
        }
    }
    node->parent=parent;
    node->left=NULL;
    node->right=NULL;
    node->data=data;
    printf("after inside newNode\n");
    return node;
}

Tree * newTree() {
    Tree *tree;
    tree = (Tree*)malloc(sizeof(Tree));
    tree->root=NULL;
    return tree;
}

// not getting inside in this function
Data * insert(Tree * tree, Data data) {
    if(tree->root==NULL) {
        tree->root = newNode(data,NULL);
    } else{
        return insertNode(tree->root,data);
    }
    return NULL;
}

Вот мой main(), который вызывает эту функцию (в main.c):

Tree *bst = newTree();
assert(bst->root == NULL);

printf("1.");
for (i = 0; i < num_data; i++){
    bst->insert(bst, (Data){d[i]});
    printf("inside for loop");
}

Я не уверен, является ли это правильным способом сделать указатели на функции в качестве членовструктура.

1 Ответ

0 голосов
/ 08 декабря 2018

В newTree() вы не назначаете свои функции указателям на функции внутри выделенной структуры tree.

Data* insert(Tree* tree, Data data);
// other function declarations as needed...

Tree* newTree() {
    Tree *tree = (Tree*) malloc(sizeof(Tree));
    if (!tree) return NULL;

    tree->root = NULL;

    tree->insert = &insert; // <-- ADD THIS!
    // and do the same for your other function pointers...
    tree->search = ...;
    tree->sort = ...;
    tree->compare = ...;
    tree->clone = ...;
    tree->delete = ...;
    tree->removeData = ...;

    return tree;
}
...