【问题标题】:如何为句子和文本结构编写 qsort() 比较器?
【发布时间】:2022-01-23 01:25:30
【问题描述】:

假设我有一个struct Sentence 和一个struct Text。如何在capital_letters_quant 上实现 qsort?怎么写出同样的比较函数?

struct Sentence {
    wchar_t* sentence_text;
    size_t sentence_size;   
    bool is_sentence_anagram;
    int64_t capital_letters_quant;
};

struct Text {
    struct Sentence* full_text;
    size_t full_text_size;
};

所以,我尝试将比较函数的参数更改为 struct Sentence *,但是编译器给出了警告或错误,我不想接收它们,老实说......

这是我的尝试

int second_compare(const void* first_current_sentence, const void* second_current_sentence) {
    return ((struct Sentence*)second_current_sentence -> capital_letters_quant) - ((struct Sentence*)first_current_sentence -> capital_letters_quant);
}

但是 gcc 把这个发给我

错误:“second_compare”的类型冲突;有'int(const void *, const void *)'

注意:先前声明的“second_compare”类型为“int(struct Sentence *, struct Sentence *)”

警告:取消引用'void *'指针

错误:在非结构或联合的情况下请求成员“capital_letters_quant”

错误:在非结构或联合的情况下请求成员“capital_letters_quant”

【问题讨论】:

  • 所以,我尝试将 compare 函数的参数更改为 struct Sentence *,但编译器给出了警告或错误,老实说,我不想接收它们...
  • edit您的问题添加信息,不要为此目的使用cmets。显示您尝试实现比较功能并复制和粘贴错误消息。这有帮助吗:stackoverflow.com/q/43100263/10622916
  • K,我似乎做了所有事情,正如我被告知的那样,我是否正确地提出了这个问题?
  • 您没有显示相关代码...从错误中可以明显看出

标签: arrays c struct qsort wchar-t


【解决方案1】:
  • 首先,您应该将second_compare 的声明更改为int second_compare (const void *, const void *);,因为声明和定义中的参数类型必须相同。
  • 其次,-> 运算符相对于强制转换运算符(struct Sentence *) 具有更高的优先级,这意味着编译器首先尝试访问 void 指针指向的结构中的字段 capital_letters_quant,因此它会尝试取消引用它。要解决此问题,您应该先强制转换,然后取消引用:... ((struct Sentence *) data) -> field ...
  • 第三,你的函数有两个指针,引用常量值(只要你用const标记它们)。但在函数体中,您将这些值转换为 (struct Sentence *) 类型的非常量值,而您应该转换为 (const struct Sentence *) 类型的常量值。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2010-09-24
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多