在C语言中对指针数组进行排序时,得到 "target unknown or block not implemented"(目标未知或块未实现)。

我正在尝试实现一个调度器,我想对一个数组进行排序。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我试过只用指数来工作,如 intuint8_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 - 1s 到255,也是当 s 是0 s-- 赋值为255,其效果是可能访问出来的 排序任务 或解除引用一个尚未初始化的指针。

为避免这种情况,最起码的改变是对 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 是索引的 “自然 “类型。

给TA打赏
共{{data.count}}人
人已打赏
未分类

Apache Spark方法sun.misc.Cleaner sun.nio.ch.DirectBuffer.cleaner()在spark-submit过程中未找到。

2022-9-8 3:29:31

未分类

Python: 使用gmap.marker_layer选项在地图上的标记标签不能使用hover_text。

2022-9-8 3:29:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索