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

问题描述 投票:0回答:1

我正在尝试实现一个调度器,我想对一个数组进行排序。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)代替指针,都没有用。我很确定问题出在这段代码上,因为没有这段代码也能工作。如果有任何帮助,我将非常感激

c pointers memory-address
1个回答
1
投票

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 是索引的 "自然 "类型。

© www.soinside.com 2019 - 2024. All rights reserved.