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

Как видите, сортировка не в порядке, и я не понимаю, почему. Заранее спасибо и извините за мой плохой английский.

, 👍0

Обсуждение

спасибо st2000 я не знал как его форматировать, @llocani

Не используйте qsort, используйте std::sort., @tttapa


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);
,

не могу поверить, что я сделал это.... как.... часами..... спасибо, мужики, я идиот...., @llocani

Я тоже некоторое время не видел. Рад, что смог помочь., @st2000