【问题标题】:A pointer to the array in a struct指向结构中数组的指针
【发布时间】:2020-11-22 00:54:38
【问题描述】:

qsort的第一个参数需要一个指向数组的指针... 在这种情况下如何传递指针?

typedef struct apData {
  char ssid[32];
  sint8 rssi;
  AUTH_MODE authmode;
  char bssid[18];
  int32_t channel;
  uint8 is_hidden;
} AP;

//BSSs SCANNED
typedef struct {
  bool scanInProgress = NOT_SCANNING;
  AP **apData;
  int numAPs;
} Scan;
static Scan scanAPs;

...

问题出在传递第一个参数... 我不明白为什么我在 compareRSSI() 函数中遇到垃圾

qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData), compareRSSI);

...

int compareRSSI(const void *bss1, const void *bss2) {
  int firstAP = ((struct apData *)bss1)->rssi;
  int secondAP = ((struct apData *)bss2)->rssi;

  return (secondAP - firstAP);
}```

【问题讨论】:

    标签: arrays sorting pointers struct qsort


    【解决方案1】:

    您正在向qsort 传递一个指向指针 数组的指针(apData 的类型为AP**),但您是说数组的每个元素都是@ 987654324@(就好像它是一组结构)。那么它是什么?

    您没有显示如何为scanAPs.apData 分配值,也没有显示为要排序的数组元素分配存储空间的位置。因此,不幸的是,不清楚您是打算对指针数组进行排序,还是打算拥有 apData 结构的数组。

    如果类型声明正确并且你有一个指针数组...

    由于apData 的类型是AP **,那么您将在某处拥有指向结构的指针数组。在这种情况下,您的排序调用应该如下所示:

    qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData*), compareRSSI);
    

    注意sizeof表示数组的每个元素都是一个指针。

    如果类型声明错误并且你有一个结构数组...

    如果是类型错误,则需要将apData的类型更改为AP*,并将其设置为等于指向数组中第一个结构的指针。您需要在某处分配适当的值,并验证您是否也为数组正确分配了存储空间。

    在为 apData 赋值时不要使用 C 风格的转换,因为编译器会确保您拥有正确的类型。

    【讨论】:

      【解决方案2】:

      这是,我的解决方案!这些人帮了我很多。 link!

      qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData*), compareRSSI);
      

      ...

      int compareRSSI(const void *bss1, const void *bss2) {
        struct apData **firstAP = (struct apData **)bss1;
        struct apData **secondAP = (struct apData **)bss2;
        return ((*secondAP)->rssi - (*firstAP)->rssi);
      }
      
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-03
        • 2012-12-07
        • 2016-06-20
        • 1970-01-01
        相关资源
        最近更新 更多