我正在使用一个函数,该函数具有一个段(如下所示),该段在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; }
}