Я бы хотел передать структуру функции по ссылке, создать новый экземпляр структуры, уничтожить оригинал и правильно вернуть новую структуру.Конкретным примером такого случая является функция изменения размера очереди:
Сама структура очереди:
// 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;
}