Получение «цели неизвестны или блок не реализован» при попытке отсортировать массив указателей в C - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь реализовать планировщик и хочу отсортировать массив Tasks типа элемента Task в новый массив указателей sortedTasks типа *Task:

Task* sortedTasks[NUMTASKS];
//for ( t = 0; t < NUMTASKS; t++ ) {    sortedTasks[t] = &Tasks[t]; }
uint8_t t;

for ( t = 0; t < NUMTASKS; t++ )
{
  uint8_t s = t - 1;
  while (s >= 0 && sortedTasks[s]->NextRelease > Tasks[t].NextRelease )
  {
    sortedTasks[s+1] = sortedTasks[s]; // shift forward element of target which is greater than param[i]
    s--;
  }
  sortedTasks[s+1] = &Tasks[t]; // insert param[i] into target
}

Однако, когда я делаю это, я получаю следующую ошибку:

msp430: =======================
msp430:io: read short at address 0x3930 at pc 0x44b4
msp430:io:     -- target unknown or block not implemented
msp430: =======================
msp430: =======================
msp430:io: read short at address 0x0000 at pc 0x44b6
msp430:io:     -- target unknown or block not implemented
msp430: =======================
msp430: =======================
msp430:io: read short at address 0x0000 at pc 0x44bc
msp430:io:     -- target unknown or block not implemented
msp430: =======================
msp430: =======================
msp430:io: read short at address 0x000a at pc 0x44be
msp430:io:     -- target unknown or block not implemented
msp430: =======================
msp430: =======================
msp430:io: read short at address 0x392e at pc 0x44b4
msp430:io:     -- target unknown or block not implemented
msp430: =======================
msp430: =======================
msp430:io: read short at address 0x0000 at pc 0x44b6
msp430:io:     -- target unknown or block not implemented
msp430: =======================
...

, и это продолжается до бесконечности. Я предполагаю, что это какая-то ошибка указателя? Я попытался инициализировать все элементы в sortedTasks, и я попытался работать с индексами как int s (фактически uint8_t s) вместо указателей, оба безрезультатно. Я почти уверен, что проблема в этом фрагменте, так как код работает без него. Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 23 апреля 2020

In

uint8_t s = t - 1;
while (s >= 0 && sortedTasks[s]->NextRelease > Tasks[t].NextRelease )
{
  sortedTasks[s+1] = sortedTasks[s]; // shift forward element of target which is greater than param[i]
  s--;
}

s не подписано, поэтому s >= 0 всегда истинно, когда t равно 0 s = t - 1, присваивает s до 255, также когда s равен 0 s--, присваивает ему значение 255, что дает возможность получить доступ из sortedTasks или разыменовывать еще не инициализированный указатель.

Минимальное изменение, которое следует избегать, - это использование типа со знаком для s и t .

В противном случае необходимо внести дополнительные изменения, например:

  Task* sortedTasks[NUMTASKS];
  uint8_t t;

  sortedTasks[0] = &Tasks[0];

  for (t = 1; t < NUMTASKS; ++t)
  {
    uint8_t s = t - 1;
    while (sortedTasks[s]->NextRelease > Tasks[t].NextRelease)
    {
      sortedTasks[s+1] = sortedTasks[s]; // shift forward element of target which is greater than param[i]
      if (s-- == 0)
        break;
    }
    sortedTasks[s+1] = &Tasks[t]; // insert param[i] uint8_to target
  }

Обратите внимание, что вы не экономите время, используя uint8_t или int8_t вместо unsigned int или int, или size_t и ssize_t, которые являются «естественными» типами для индексов

...