2015-11-25 103 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