尝试对 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
中的所有元素,并尝试将索引用作 int
s(实际上是 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,其效果可能是 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
不会节省时间是索引的 'natural' 类型
我正在尝试实现一个调度程序,我想将元素类型 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
中的所有元素,并尝试将索引用作 int
s(实际上是 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,其效果可能是 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
不会节省时间是索引的 'natural' 类型