Передать структуру по ссылке, вернуть указатель на новую структуру - PullRequest
0 голосов
/ 08 октября 2018

Я бы хотел передать структуру функции по ссылке, создать новый экземпляр структуры, уничтожить оригинал и правильно вернуть новую структуру.Конкретным примером такого случая является функция изменения размера очереди:

Сама структура очереди:

// Queue for storage of pairs
typedef struct {
    int n;        // size of queue
    int m;        // no. of pairs in queue
    int f;        // index of front element
    int r;        // index of rear element
    pair *pairs;  // array of pairs
} queue;

Процедура инициализации очереди:

// Initialises queue
int init(int const *n, queue *q) {

    q->n = *n;
    q->m =  0;
    q->f =  0;
    q->r =  0;

    q->pairs = (pair*) calloc(q->n, sizeof(pair));

    return 0;
}

Процедура уничтожения очереди:

// Destroys queue
int destroy(queue *q) {

    q->n = 0;
    q->m = 0;
    q->f = 0;
    q->r = 0;
    free(q->pairs);

    return 0;
}

Подпрограмма постановки в очередь:

// Adds pair to queue
int enqueue(pair *p, queue *q) {

    // resize queue if necessary
    if (isfull(q))  int status = resize(q);

    if (q->m > 0)  q->r = (++q->r) % q->n;
    q->pairs[q->r] = *p;
    q->m++;

    return 0;
}

Мой взгляд на подпрограмму изменения размера очереди (в настоящее время происходит сбой с исключением с плавающей запятой).Я считаю, что для правильного изменения размера очереди мне нужно передать указатель на указатель очереди, но пока я не могу этого добиться.

// Resizes queue
int resize(queue *q) {

    // initialise new queue
    const int N = 2*q->n;
    queue p;
    init(&N, &p);

    // copy pairs from old to new queue
    for (int i = 0; i < q->m; i++) {
        pair f = dequeue(q);
        enqueue(&f, &p);
    }

    // destroy old queue
    destroy(q);

    // re-assign pointer to new queue
    q = &p;

    return 0;
}

1 Ответ

0 голосов
/ 08 октября 2018

Переназначение указателя совершенно бесполезно.Вы изменили его локально, но это не изменило исходный объект.То, что вы сделали, это уничтожили исходную очередь, и ничего не осталось на месте.

Что вы хотите сделать, это изменить предоставленный объект in-place .

Например:

*q = p; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...