c - c中的指针表达式有什么问题?

标签 c sorting pointers

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

我添加了 (typsort == 2) 的代码,如下所示,但只有当我将保留类作为唯一的排序类型时,它才能正确排序。如果我使用辅助排序(例如按保留类别)进行排序,并命名它,则不会排序。

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

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 (char rc)
{
/

Given a reserve class string , return a reserve class number.
*/

register int i;
register char *p, *q;

static struct
{
int index;
char str;
} RCposs[] =
{
{
1, "PROVED DEVELOPED PRODUCING"},
{
2, "PROVED PRODUCING SECONDARY"},
{
3, "PROVED PRODUCING TERTIARY"},
{
1, "PROVED PRODUCING"},
{
4, "PROVED SHUT-IN"},
{
5, "PROVED DEVELOPED NON-PRODUCING"},
{
5, "PROVED NON-PRODUCING"},
{
6, "PROVED DEVELOPED BEHIND-PIPE"},
{
6, "PROVED BEHIND-PIPE"},
{
8, "PROVED UNDEVELOPED SECONDARY"},
{
9, "PROVED UNDEVELOPED TERTIARY"},
{
7, "PROVED UNDEVELOPED"},
{
1, "PROVED"},
{
10, "PROBABLE DEVELOPED PRODUCING"},
{
11, "PROBABLE PRODUCING SECONDARY"},
{
12, "PROBABLE PRODUCING TERTIARY"},
{
13, "PROBABLE SHUT-IN"},
{
10, "PROBABLE PRODUCING"},
{
14, "PROBABLE DEVELOPED NON-PRODUCING"},
{
14, "PROBABLE NON-PRODUCING"},
{
15, "PROBABLE DEVELOPED BEHIND-PIPE"},
{
15, "PROBABLE BEHIND-PIPE"},
{
17, "PROBABLE UNDEVELOPED SECONDARY"},
{
18, "PROBABLE UNDEVELOPED TERTIARY"},
{
16, "PROBABLE UNDEVELOPED"},
{
20, "PROBABLE PRIMARY/SECONDARY"},
{
21, "PROBABLE SECONDARY"},
{
19, "PROBABLE"},
{
22, "POSSIBLE DEVELOPED PRODUCING"},
{
23, "POSSIBLE PRODUCING SECONDARY"},
{
24, "POSSIBLE PRODUCING TERTIARY"},
{
25, "POSSIBLE SHUT-IN"},
{
22, "POSSIBLE PRODUCING"},
{
26, "POSSIBLE DEVELOPED NON-PRODUCING"},
{
26, "POSSIBLE NON-PRODUCING"},
{
27, "POSSIBLE DEVELOPED BEHIND-PIPE"},
{
27, "POSSIBLE BEHIND-PIPE"},
{
29, "POSSIBLE UNDEVELOPED SECONDARY"},
{
30, "POSSIBLE UNDEVELOPED TERTIARY"},
{
28, "POSSIBLE UNDEVELOPED"},
{
22, "POSSIBLE"},
{
32, "PROSPECTIVE PRIMARY/SECONDARY"},
{
33, "PROSPECTIVE SECONDARY"},
{
31, "PROSPECTIVE"},
{
34, "ANALOGY"},
{
35, "DEPLETE"},
{
36, "PROV+PROB+POSS UNDEVELOPED RESERVES"},
{
37, "PROV+PROB+POSS DEVELOPED RESERVES"},
{
38, "PROV+POSS UNDEVELOPED RESERVES"},
{
39, "PROV+POSS DEVELOPED RESERVES"},
{
40, "PROB+POSS UNDEVELOPED RESERVES"},
{
41, "PROB+POSS DEVELOPED RESERVES"},
{
42, "PROV+PROB UNDEVELOPED RESERVES"},
{
43, "PROV+PROB DEVELOPED RESERVES"},
{
44, "RISKED PROV UNDEVELOPED RESERVES"},
{
45, "RISKED PROB UNDEVELOPED RESERVES"},
{
46, "RISKED POSS UNDEVELOPED RESERVES"},
{
47, "RISKED PROV BEHIND-PIPE RESERVES"},
{
48, "RISKED PROB BEHIND-PIPE RESERVES"},
{
49, "RISKED POSS BEHIND-PIPE RESERVES"},
{
50, "PLANT PRODUCTS SALES"},
{
51, "PROBABLE PLANT PRODUCTS SALES"},
{
52, "POSSIBLE PLANT PRODUCTS SALES"},
{
53, "POTENTIAL PLANT PRODUCTS SALES"},
{
54, "PROVED GAS PIPELINE SALES"},
{
55, "PROBABLE GAS PIPELINE SALES"},
{
56, "POSSIBLE GAS PIPELINE SALES"},
{
57, "POTENTIAL GAS PIPELINE SALES"},
{
58, "PROVED OIL PIPELINE SALES"},
{
59, "PROBABLE OIL PIPELINE SALES"},
{
60, "POSSIBLE OIL PIPELINE SALES"},
{
61, "POTENTIAL OIL PIPELINE SALES"},
{
0, NULL /
terminator */ }};

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; }
}

关于c - c中的指针表达式有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121378/

相关文章:

c - 数组和结构体

ios - 在swift中按字母顺序对数组进行排序

javascript - 将数组分解为子集

javascript - 为什么 JavaScript 不能对 [5, 10, 1] 进行排序?

C - 一行代码正在更改结构的地址

c - 如何使用指针删除字符串中的元音

c - 关于C中动态内存分配的问题

c - 发现 secret 号码时需要帮助终止程序

c - 解释格式说明符 %f 以及点在其中如何工作

c - C中的结构使用指针