Добавление элемента массива к самому массиву

#arrays #c #pointers

#массивы #c #указатели

Вопрос:

Я работаю с небольшим массивом в виде указателя int. Для примера, массив имеет 3 элемента, [0, 1, 2] .

Я хочу, основываясь на проверке, взять элемент с индексом i и переместить его в конец массива. Если индекс равен 0, массив должен быть переупорядочен [1, 2, 0]. Затем, в следующий раз, когда я это сделаю, если индекс равен 1, он должен быть переупорядочен [1, 0, 2] .

Проверка, которую я использую, заключается в том, равно ли текущее значение в индексе i определенному значению элемента структуры. Код структуры выглядит следующим образом:

 struct          Process {
    int id;
    int cpu;
    int io;
    int arrival;
};
 

Мой массив, над которым я работаю, называется queue . Это моя текущая попытка изменить порядок:

 for (int q = 0; q < n; q  ) {
    if (queue[q] == p[i].id) {
        while (q   < n)
            queue[q] = queue[q   1];
        queue[n - 1] = p[i].id;
        break;
    }
}
 

Итак, я проверяю, равен ли элемент queue идентификатору экземпляра процесса (p[] — это список процессов типа Process). Если это так, я хочу сдвинуть каждый элемент назад на 1, затем установить последний элемент равным идентификатору того экземпляра процесса, который я использовал для проверки. Цикл while был ранее (с n = общее количество процессов и, следовательно, общее количество элементов очереди):

 for (int r = q   1; r < n; r  ) {}
 

но я считаю, что оба имеют одинаковый эффект, и ни один из них не работает так, как я думаю, они должны.

Стоит упомянуть, что элементы queue устанавливаются на основе идентификаторов элементов в p[] по мере инициализации этих элементов, поэтому p[i].id всегда должен быть найден в очереди.

Комментарии:

1. На последней итерации вы получаете доступ за пределы массива. Вы проверяете старое значение q , чтобы увидеть, находится ли оно в границах, а затем увеличиваете его на .

2. Кроме того, со 2-й по последнюю итерацию queue[q 1] находится вне массива.

3. Я заметил это сразу после того, как опубликовал сообщение. Разве он не попытался бы получить доступ за пределы массива только на последней итерации цикла while? На предпоследней итерации не q = n — 2? В любом случае, мне любопытно, почему это не привело к сбою.

4. Потому что вы используете post-increment, а не pre-increment. q < n сравнивает текущее значение q с n , видит, что оно находится в диапазоне, затем увеличивает его и переходит в тело цикла. Итак q = n , на последней итерации.

5. Изменение его на while ( q < n) {queue[q - 1] = queue[q];} , кажется, сделало свое дело!