我有一个for循环,用于找到最危险的特定船舶的直升机。
我遇到的问题是我需要忽略搜索中的LifeBoats(它们的类型为L
,它是结构中的单个字符)并且只关注直升机,由{{1}表示这是结构中的单个字符。
我遇到的问题是当我有这个for循环时:
H
它肯定会被调用,我添加了一行:
closest_index = 0;
for (j = 0; j < asset_size; j++) {
printf("type : %c \n", (assets + j)->type);
if ((assets + j)->type == 'H') {
if (((assets + j) ->distance_from_mayday) < ((assets + closest_index) ->distance_from_mayday)) {
closest_index = j;
printf("closest_index heli = %d \n", closest_index);
}
}
}
在比较之前,它在控制台中产生了这个结果:
printf("type : %c \n", (assets + j)->type);
正如你所看到的那样,type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : L
type : H
type : H
type : H
type : H
type : H
type : H
有值,所以我不明白为什么这个for循环没有按意图执行,有什么想法吗?
答案 0 :(得分:3)
我猜,列表中的第一个元素是'L'类型,并且低于或等于任何'H'值。因此,closest_index
标记不会被移动。
最好记录距离本身或使用不可能的起始值(-1
?)closest_index
编辑:
建议代码:
struct asset *result = NULL;
for (j = 0; j < asset_size; j++) {
if (assets[j].type != 'H')
continue;
if (!result || assets[j].distance < result->distance)
result = &assets[j];
}
答案 1 :(得分:1)
你的代码首先假设阵列中的第一个索引,在这种情况下是救生艇,是距离事件最近的直升机。
也许尝试这样的事情:
closest_index = 0;
closest_distance = INT_MAX;
for (j = 0; j < asset_size; j++) {
printf("type : %c \n", assets[j]->type);
if (assets[j]->type == 'H') {
if (assets[j]->distance_from_mayday < closest_distance) {
closest_index = j;
closest_distance = assets[j]->distance_from_mayday;
printf("closest_index heli = %d \n", closest_index);
}
}
}
如果您的列表总是在最后用helis排序(并且您将始终至少有一个heli),那么您可以通过将初始条件更改为:
来修复closest_index = asset_size -1;
答案 2 :(得分:1)
问题不在于for
;这是if
:没有一架直升机比第一艘救生艇更近。这是解决这个问题的一种方法:
closest_index = -1;
for (j = 0; j < asset_size; j++) {
printf("type : %c\n", (assets + j)->type);
if ((assets + j)->type == 'H') {
if ((closest_index < 0) ||
(assets + j)->distance_from_mayday <
(assets + closest_index)->distance_from_mayday) {
closest_index = j;
printf("closest_index heli = %d\n", closest_index);
}
}
}
作为奖励,如果没有直升机,循环将以closest_index == -1
退出。
如果你关心最近的资产而不关心索引,你也可以简化循环:
Asset *closest_asset = NULL;
for (j = 0; j < asset_size; j++) {
Asset *this_asset = assets + j;
printf("type : %c\n", this_asset->type);
if (this_asset->type == 'H' &&
(closest_asset == NULL ||
this_asset->distance_from_mayday < closest_asset->distance_from_mayday) {
closest_asset = this_asset;
printf("closest_index heli = %d\n", j);
}
}