#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];}
, кажется, сделало свое дело!