qsort на самом деле не сортирует
Я работаю с Arduino и получаю странные ошибки. qsorting сортирует неправильно.
//using this libraries
#include <ESP8266WiFi.h>
#include <inttypes.h>
//the red struct is
typedef struct {
int32_t rssi;
int id;
} red;
//Here is my compare function
int compare (const void * a, const void * b)
{
yield();
red *redA = (red *)a;
red *redB = (red *)b;
//Serial.printf("redA->rssi: %d, redB->rssi: %d\n",redA->rssi,redB->rssi);
//Serial.flush();
return redA->rssi > redB->rssi ? 1 : (redB->rssi < redA->rssi ? -1 : 0);
//return ( redB->rssi - redA->rssi );
}
void showNetworks(){
int n = WiFi.scanNetworks(false,false);
red listOfRedes[n];
for (int i = 0; i < n; i++) // ...initialize it
{
yield();
listOfRedes[i].rssi = WiFi.RSSI(i);
listOfRedes[i].id = i;
Serial.printf("%d: RSSI%d\n", i, listOfRedes[i].rssi);
Serial.flush();
}
Serial.printf("salio\n");
Serial.flush();
qsort (listOfRedes, n, sizeof(red), compare);
Serial.printf("ordeno\n");
for (int i = 0; i < n; i++) // ...initialize it
{
yield();
Serial.printf("%d: RSSI:%" PRId32 "\n", listOfRedes[i].id, listOfRedes[i].rssi);
}
}
и вот что я получаю
0: RSSI-69
1: RSSI-65
2: RSSI-72
3: RSSI-50
4: RSSI-60
5: RSSI-87
6: RSSI-87
7: RSSI-79
8: RSSI-80
9: RSSI-88
10: RSSI-74
11: RSSI-77
12: RSSI-78
13: RSSI-83
14: RSSI-79
15: RSSI-60
16: RSSI-85
17: RSSI-86
18: RSSI-66
19: RSSI-88
20: RSSI-80
21: RSSI-74
22: RSSI-81
23: RSSI-87
salio
ordeno
4: RSSI:-60
1: RSSI:-65
0: RSSI:-69
3: RSSI:-50
18: RSSI:-66
15: RSSI:-60
2: RSSI:-72
10: RSSI:-74
11: RSSI:-77
21: RSSI:-74
19: RSSI:-88
20: RSSI:-80
22: RSSI:-81
23: RSSI:-87
12: RSSI:-78
5: RSSI:-87
6: RSSI:-87
7: RSSI:-79
8: RSSI:-80
9: RSSI:-88
13: RSSI:-83
14: RSSI:-79
16: RSSI:-85
17: RSSI:-86
Как видите, сортировка не в порядке, и я не понимаю, почему. Заранее спасибо и извините за мой плохой английский.
@llocani, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 1
В вашей программе есть эта строка кода:
return redA->rssi > redB->rssi ? 1 : (redB->rssi < redA->rssi ? -1 : 0);
Который, кажется, возвращает 1, если A больше, чем B, в противном случае он возвращает 0. Этот код не может определить разницу между A < B и A == B. Попробуйте изменить эту строку кода, чтобы разрешить возврат 1 для A > B, 0 для A == B и -1 для A < Б:
return redA->rssi > redB->rssi ? 1 : (redA->rssi < redB->rssi ? -1 : 0);
,
@st2000
не могу поверить, что я сделал это.... как.... часами..... спасибо, мужики, я идиот...., @llocani
Я тоже некоторое время не видел. Рад, что смог помочь., @st2000
Смотрите также:
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
спасибо st2000 я не знал как его форматировать, @llocani
Не используйте
qsort
, используйтеstd::sort
., @tttapa