我正在使用一个函数,该函数具有一个段(如下所示),该段在qsort中用于比较按升序或降序排序的变量字段。我添加了一个三阶(升序为0,降序为1,三阶为2),在该函数中,我在NormalizeResClass函数中对气井和油井分类进行了排序,该函数为分类返回了不同的int

我添加了(typsort == 2)的代码,如下所示,但是只有当保留类是唯一的排序类型时,它才能正确排序。如果我使用备用类别(例如储备金类别)进行排序,并以好名命名,则不进行排序。

else块中的原始代码在xval和yval之前使用*((int *),我在指针方面很弱。我知道它正在强制转换为int,但是NormalizeResClass函数已经返回一个int,所以我不需要强制转换,如果使用它,我会遇到segmentaion错误。

static char *Strings = NULL; // Global var

int result= 0; // local var
int ft; // local var

// ft is checked before going to this to be >= 0

if (typsort == 2)
{
    // the code that I have added
    result = strncmp (Strings + NormalizeResClass (xval),
                      Strings + NormalizeResClass (yval), ft);
}
else
{
    // this code was there and the sorting was right
    result = strncmp (Strings + *((int *) xval),
                      Strings + *((int *) yval), ft);
}


这是下面的规范化功能,我可能需要确保所有这些功能都具有唯一性
数个相同。

int NormalizeResClass(字符rc)
{
   /
      给定备用类别字符串,返回备用类别编号。
    * /

登记我
   注册char * p,* q;

静态结构
   {
      整数索引
      char str;
   } RCposs [] =
   {
      {
      1,“已提供开发证明”},
      {
      2,“提供的中学课程”},
      {
      3,“提供的生产证明”},
      {
      1,“已提供证明”},
      {
      4,“已提供关机”},
      {
      5,“提供的已开发的非生产”},
      {
      5,“提供的非制作内容”},
      {
      6,“提供的后置管道”},
      {
      6,“ PROVED BEHIND-PIPE”},
      {
      8,“提供未开发的中学”},
      {
      9,“提供未开发的高等教育”},
      {
      7,“未提供证明”},
      {
      1,“已提供”},
      {
      10,“可能开发的产品”},
      {
      11,“可能的中学”},
      {
      12,“可能的生产高等教育”},
      {
      13,“可能的关机”},
      {
      10,“可能的生产”},
      {
      14,“可能的开发的非生产”},
      {
      14,“可能的非生产性”},
      {
      15,“可能的后置管道”},
      {
      15,“可能的管道”},
      {
      17,“可能未开发的第二级”},
      {
      18,“可能未开发的高等教育”},
      {
      16,“可能未开发”},
      {
      20,“可能的主要/次要”},
      {
      21,“可能的中学”},
      {
      19,“ PROBABLE”},
      {
      22,“可能开发的产品”},
      {
      23,“可能第二生产”},
      {
      24,“可能的生产高等教育”},
      {
      25,“可能的关机”},
      {
      22,“可能的生产”},
      {
      26,“可能开发的非生产商品”},
      {
      26,“可能的非生产”},
      {
      27,“可能的管道后置”},
      {
      27,“可能的管道”},
      {
      29,“可能的未开发中学”},
      {
      30,“可能的未开发的高等教育”},
      {
      28,“可能未开发”},
      {
      22,“可能”},
      {
      32,“预期的主要/次要”},
      {
      33,“准中学”},
      {
      31,“ PROSPECTIVE”},
      {
      34,“ ANALOGY”},
      {
      35,“ DEPLETE”},
      {
      36,“ PROV + PROB + POSS未开发的储备”},
      {
      37,“ PROV + PROB + POSS已开发的预留”},
      {
      38,“ PROV + POSS未开发的储备金”},
      {
      39,“ PROV + POSS开发的储备金”},
      {
      40,“ PROB + POSS未开发的预留”},
      {
      41,“ PROB + POSS开发的预留”},
      {
      42,“ PROV + PROB未开发的预留”},
      {
      43,“ PROV + PROB开发的预留空间”},
      {
      44,“有风险的未开发储备金”},
      {
      45,“有风险的未开发储备金”},
      {
      46,“风险未开发的储备金”},
      {
      47,“有风险的后备管道储备”}},
      {
      48,“管道预留的潜在问题”},
      {
      49,“管道预留后有风险的姿势”},
      {
      50,“植物产品销售”},
      {
      51,“植物产品的销售量”},
      {
      52,“可能的植物产品销售”},
      {
      53,“潜在植物产品销售”},
      {
      54,“提供的天然气管道销售”},
      {
      55,“可能的天然气管道销售”},
      {
      56,“可能的管道销售”},
      {
      57,“潜在的天然气管道销售”},
      {
      58,“已提供的石油管道销售”},
      {
      59,“可能的石油管道销售”},
      {
      60,“可能的油管销售”},
      {
      61,“潜在的石油管道销售”},
      {
   0,NULL /终止符* /}};

for (i = 0; (q = RCposs[i].str); i++) { p = rc; while (*p++ == *q++) { if ((*q == '\0')) return RCposs[i].index; } }return (0);

}

最佳答案

根据显示的代码,全局Strings变量看起来像是一块很大的内存,其中包含许多不同的字符串(大概每个记录一个)。

原始代码:

result = strncmp (Strings + *((int *) xval),
                  Strings + *((int *) yval), ft);


Strings[xval]处的字符串与Strings[yval]处的字符串进行比较,最大长度为ft

我不知道NormalizeResClass(x)函数的作用,但是如果它要以与旧代码类似的方式工作,则需要返回一个int,该Strings代表字符串中字符串开头的位置strncmp内存块。它一定不能返回该内存块之外的索引,否则对NormalizeResClass的调用将从知道谁的地方开始读取。

更新:

看起来您的strncmp()函数为资源类字符串返回整数排名。在这种情况下,您根本不应使用Strings[]和。代码应如下所示:

if (typsort == 2)
{
    int xRank = NormalizeResClass (xval);
    int yRank = NormalizeResClass (yval);
    if (xRank == yRank) { result = 0; }
    else if (xRank > yRank) { result = 1; }
    else if (xRank < yRank) { result = -1; }
}

09-06 01:58