我正在尝试实现一个调度器,我想对一个数组进行排序。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
的 uint8_t
s)代替指针,都没有用。我很确定问题出在这段代码上,因为没有这段代码也能工作。如果有任何帮助,我将非常感激
在
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,其效果是可能访问出来的 排序任务 或解除引用一个尚未初始化的指针。
为避免这种情况,最起码的改变是对 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
是索引的 "自然 "类型。