2011-02-25 23 views
-1

我正在使用一個函數,該函數具有在qsort中用於比較以升序或取消順序排序的變量字段的段(如下所示)。我在NormalizeResClass函數中對氣體和油井分類進行了排序,並添加了第三個訂單(斷言爲0,下降爲1,第三個訂單爲2),該函數爲分類返回不同的intc中的指針表達有什麼問題?

我添加了如下所示的(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 (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);

}

+5

你的問題是什麼?怎麼了? – EboMike 2011-02-25 18:56:22

+0

另外:'NormalizeResClass'函數做了什麼?它有副作用嗎? – 2011-02-25 19:12:09

回答

2

根據您所顯示的代碼,它看起來像全球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; } 
} 
+0

如果你看看我說過的話,我添加了NormalizeClassRes函數來嘗試處理石油或天然氣儲備分類中的排序,但問題是隻有在選擇了此變量報告程序中的唯一字段時才能正確排序。如果我按保留級別排序多於一個字段,則排序不正確。我不知道基於原始代碼和*((int *)部分是否擁有正確的代碼。字符串保留了排序字段的文本我相信。 – user634708 2011-03-01 21:18:10

+0

請在回答中看到上面的答案。很難說清楚如何在舊代碼中使用字符串[]',我不認爲開發者留下了任何有用的評論?':'' – 2011-03-01 22:00:20