2015-11-25 108 views
1

我發現這個例子,但是當我得到編譯警告。如果有人能幫助我,我會非常感激。QuickSort示例不會編譯

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* qsort int comparison function */ 
int int_cmp(const void *a, const void *b) 
{ 
    const int *ia = (const int *)a; // casting pointer types 
    const int *ib = (const int *)b; 
    return *ia - *ib; 
    /* integer comparison: returns negative if b > a 
    and positive if a > b */ 
} 

/* integer array printing function */ 
void print_int_array(const int *array, size_t len) 
{ 
    size_t i; 

    for(i=0; i<len; i++) 
     printf("%d | ", array[i]); 

    putchar('\n'); 
} 

/* sorting integers using qsort() example */ 
void sort_integers_example() 
{ 
    int numbers[] = { 7, 3, 4, 1, -1, 23, 12, 43, 2, -4, 5 }; 
    size_t numbers_len = sizeof(numbers)/sizeof(int); 

    puts("*** Integer sorting..."); 

    /* print original integer array */ 
    print_int_array(numbers, numbers_len); 

    /* sort array using qsort functions */ 
    qsort(numbers, numbers_len, sizeof(int), int_cmp); 

    /* print sorted integer array */ 
    print_int_array(numbers, numbers_len); 
} 

/* qsort C-string comparison function */ 
int cstring_cmp(const void *a, const void *b) 
{ 
    const char **ia = (const char **)a; 
    const char **ib = (const char **)b; 
    return strcmp(*ia, *ib); 
    /* strcmp functions works exactly as expected from 
    comparison function */ 
} 

/* C-string array printing function */ 
void print_cstring_array(char **array, size_t len) 
{ 
    size_t i; 

    for(i=0; i<len; i++) 
     printf("%s | ", array[i]); 

    putchar('\n'); 
} 

/* sorting C-strings array using qsort() example */ 
void sort_cstrings_example() 
{ 
    char *strings[] = { "Zorro", "Alex", "Celine", "Bill", "Forest", "Dexter" }; 
    size_t strings_len = sizeof(strings)/sizeof(char *); 

    /** STRING */ 
    puts("*** String sorting..."); 

    /* print original string array */ 
    print_cstring_array(strings, strings_len); 

    /* sort array using qsort functions */ 
    qsort(strings, strings_len, sizeof(char *), cstring_cmp); 

    /* print sorted string array */ 
    print_cstring_array(strings, strings_len); 
} 



/* an example of struct */ 
struct st_ex { 
    char product[16]; 
    float price; 
}; 

/* qsort struct comparision function (price float field) */ 
int struct_cmp_by_price(const void *a, const void *b) 
{ 
    struct st_ex *ia = (struct st_ex *)a; 
    struct st_ex *ib = (struct st_ex *)b; 
    return (int)(100.f*ia->price - 100.f*ib->price); 
    /* float comparison: returns negative if b > a 
    and positive if a > b. We multiplied result by 100.0 
    to preserve decimal fraction */ 

} 

/* qsort struct comparision function (product C-string field) */ 
int struct_cmp_by_product(const void *a, const void *b) 
{ 
    struct st_ex *ia = (struct st_ex *)a; 
    struct st_ex *ib = (struct st_ex *)b; 
    return strcmp(ia->product, ib->product); 
    /* strcmp functions works exactly as expected from 
    comparison function */ 
} 

/* Example struct array printing function */ 
void print_struct_array(struct st_ex *array, size_t len) 
{ 
    size_t i; 

    for(i=0; i<len; i++) 
     printf("[ product: %s \t price: $%.2f ]\n", array[i].product, array[i].price); 

    puts("--"); 
} 

/* sorting structs using qsort() example */ 
void sort_structs_example(void) 
{ 
    struct st_ex structs[] = {{"mp3 player", 299.0f}, {"plasma tv", 2200.0f}, 
           {"notebook", 1300.0f}, {"smartphone", 499.99f}, 
           {"dvd player", 150.0f}, {"matches", 0.2f }}; 

    size_t structs_len = sizeof(structs)/sizeof(struct st_ex); 

    puts("*** Struct sorting (price)..."); 

    /* print original struct array */ 
    print_struct_array(structs, structs_len); 

    /* sort array using qsort functions */ 
    qsort(structs, structs_len, sizeof(struct st_ex), struct_cmp_by_price); 

    /* print sorted struct array */ 
    print_struct_array(structs, structs_len); 

    puts("*** Struct sorting (product)..."); 

    /* resort using other comparision function */ 
    qsort(structs, structs_len, sizeof(struct st_ex), struct_cmp_by_product);  

    /* print sorted struct array */ 
    print_struct_array(structs, structs_len); 
} 


/* MAIN program (calls all other examples) */ 
int main() 
{ 
    /* run all example functions */ 
    sort_integers_example(); 
    sort_cstrings_example(); 
    sort_structs_example(); 
    return 0; 
} 

/* 
Execution result: 


*** Integer sorting... 
7 | 3 | 4 | 1 | -1 | 23 | 12 | 43 | 2 | -4 | 5 | 
-4 | -1 | 1 | 2 | 3 | 4 | 5 | 7 | 12 | 23 | 43 | 
*** String sorting... 
Zorro | Alex | Celine | Bill | Forest | Dexter | 
Alex | Bill | Celine | Dexter | Forest | Zorro | 
*** Struct sorting (price)... 
[ product: mp3 player price: $299.00 ] 
[ product: plasma tv  price: $2200.00 ] 
[ product: notebook  price: $1300.00 ] 
[ product: smartphone price: $499.99 ] 
[ product: dvd player price: $150.00 ] 
[ product: matches  price: $0.20 ] 
-- 
[ product: matches  price: $0.20 ] 
[ product: dvd player price: $150.00 ] 
[ product: mp3 player price: $299.00 ] 
[ product: smartphone price: $499.99 ] 
[ product: notebook  price: $1300.00 ] 
[ product: plasma tv  price: $2200.00 ] 
-- 
*** Struct sorting (product)... 
[ product: dvd player price: $150.00 ] 
[ product: matches  price: $0.20 ] 
[ product: mp3 player price: $299.00 ] 
[ product: notebook  price: $1300.00 ] 
[ product: plasma tv  price: $2200.00 ] 
[ product: smartphone price: $499.99 ] 
-- 
*/ 

我的錯誤是:

g++ -Wall -o "Qiksortfromnet" "Qiksortfromnet.cpp" (in directory: /home/dylan) 
Qiksortfromnet.cpp: In function ‘void sort_cstrings_example()’: 
Qiksortfromnet.cpp:68:79: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
    char *strings[] = { "Zorro", "Alex", "Celine", "Bill", "Forest", "Dexter" }; 
                      ^

Qiksortfromnet.cpp:68:79: warning: deprecated conversion from string 
constant to ‘char*’ [-Wwrite-strings] Qiksortfromnet.cpp:68:79: 
warning: deprecated conversion from string constant to ‘char*’ 
[-Wwrite-strings] Qiksortfromnet.cpp:68:79: warning: deprecated 
conversion from string constant to ‘char*’ [-Wwrite-strings] 
Qiksortfromnet.cpp:68:79: warning: deprecated conversion from string 
constant to ‘char*’ [-Wwrite-strings] Qiksortfromnet.cpp:68:79: 
warning: deprecated conversion from string constant to ‘char*’ 
[-Wwrite-strings] Compilation finished successfully. 

從我的錯誤/警告的老用戶刪除一半最後編輯......請不要那樣做!

+0

變化編譯'char * strings []'到'const char * strings []'。字符串文字的類型爲'const char *'。 – mch

+0

只是要清楚。這些警告不是錯誤('-Werror'編譯器標誌可以將它們變成實際的編譯錯誤,但在這裏似乎不是這種情況)。 「編譯成功完成。」 - 所以它看起來像你的編譯成功完成。 – kaylum

+0

@mch我這樣做後出現錯誤。 – GeekyDewd

回答

1

變化線:

  • 68:初始化:常量字符*串[]
  • 55:參數:常量字符**陣列

-Wno-write-strings