尝试对 C 中的指针数组进行排序时得到 "target unknown or block not implemented"

Getting "target unknown or block not implemented" when trying to sort an array of pointers in C

我正在尝试实现一个调度程序,我想将元素类型 Task 的数组 Tasks 排序为类型 *Task 的新指针数组 sortedTasks :

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 中的所有元素,并尝试将索引用作 ints(实际上是 uint8_ts)而不是指针,但都无济于事。我很确定问题出在这个片段中,因为代码在没有它的情况下也能工作。任何帮助将不胜感激!

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 或取消引用尚未初始化的指针。

避免这种情况的最小更改是为 st.

使用带符号的类型

否则必须进行更多更改,例如:

  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_tint8_t 而不是 unsigned intintsize_tssize_t 不会节省时间是索引的 'natural' 类型