Как сделать функцию, которая изменяет структуру - PullRequest
2 голосов
/ 19 апреля 2019

Я делаю программу для размещения оценок учеников в массиве, используя структуру в качестве практики для финала. Мне нужно сделать функцию, которая проверяет, остались ли какие-либо позиции в массиве, а если нет, массив должен удвоиться в размере, а затем оценка должна быть добавлена ​​к следующей доступной позиции. Если в массиве есть открытые позиции, то значения оценок должны быть добавлены к следующей доступной позиции. grades_array_pos и grades_array_size должны обновляться правильными значениями всякий раз, когда происходит изменение в массиве. Я довольно новичок в C, и мне трудно обдумать, как это сделать. Все это должно быть сделано с использованием только базовых переменных, для циклов for и while, и очень простым способом.

struct student_grades
{
    int student_id; 
    int *grades_array[10];
    int grades_array_pos;
    int grades_array_size;
};
void add_grade(struct student_grades * student, int assignment_grade){

}

1 Ответ

3 голосов
/ 19 апреля 2019

Это критический, но простой навык, который каждый должен освоить. Основной подход состоит в том, чтобы сохранить переменную, содержащую текущее количество выделенных элементов и счетчик на используемое число. Тогда цикл заполнения вашего массива. В начале вашего цикла проверьте, if (used == allocated), чтобы определить, требуется ли перераспределение.

Если требуется перераспределение, с помощью указателя TEMPORARY вызовите realloc и удвойте количество выделенных элементов. Проверьте, что realloc успешно, в противном случае прервите цикл, заполняющий ваш массив (не выходите из программы), так как исходный указатель на ваш массив все еще указывает на действительные данные до попытки realloc.

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

#define NSTRUCT 8    /* initial number of struct to allocate for array */
...
size_t  allocated = NSTRUCT,   /* holds current number of elements allocated */
        used = 0;              /* holds current number used/filled */
struct student_grades *grades = malloc (allocated * sizeof *grades);

if (!grades) {
    perror ("malloc-grades");
    return 1;
}

while (/* loop to fill struct array */) {

    if (used == allocated) {    /* check if realloc needed */
        /* always realloc using a TEMPORARY pointer */
        void *tmp = realloc (grades, 2 * allocated * sizeof *grades);
        if (!tmp) { /* validate reallocation */
            perror ("realloc-grades");
            break;  /* don't exit, original pointer still good */
        }
        grades = tmp;       /* assign reallocated block to grades */
        allocated *= 2;     /* update allocated size */
    }

    /* fill next element -- keep going.... */
    used++;
}

Посмотрите вещи и дайте мне знать, если у вас все еще есть вопросы.

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