2010-09-14 5 views
1

я следующий кодрода аргументов

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int comp(const void *a, const void *b){ 
char *const *aa=a; 
char *const *bb=b; 
return strcmp(*aa,*bb): 


} 
int main(int argc,char **argv){ 

int i; 
    qsort(argv+1,argc-1,sizeof *argv,comp); 
    for (i=1;i<argc;i++) 
     printf("i: %d==> '%s'\n",i,argv[i]); 
    return 0; 


} 

но вот ошибки

Error 1 error C2440: 'initializing' : cannot convert from 'const void *' to 'char *const *' c:\users\student\documents\visual studio 2008\projects\sort_argv\sort_argv\sort_argv.cpp 5 sort_argv 
Error 2 error C2440: 'initializing' : cannot convert from 'const void *' to 'char *const *' c:\users\student\documents\visual studio 2008\projects\sort_argv\sort_argv\sort_argv.cpp 6 sort_argv 

Ошибка 3 Ошибка C2143: синтаксическая ошибка: отсутствует ';' до ':'

c:\users\student\documents\visual studio 2008\projects\sort_argv\sort_argv\sort_argv.cpp 7 sort_argv 

Ошибка 4 ошибка C2143: синтаксическая ошибка: отсутствует ';' Перед «:»

c:\users\student\documents\visual studio 2008\projects\sort_argv\sort_argv\sort_argv.cpp 7 sort_argv 

пожалуйста, помогите

+2

Проблема в том, что вы пытаетесь скомпилировать C-код с помощью компилятора C++. Это разные языки, следовательно, ошибки. –

ответ

2

Я думаю, ваш вопрос не так спросил, и это показывает, что вы даже не читали код внимательно, прежде чем спрашивать. Вместе с тем одна очевидная ошибка заключается в следующем:

return strcmp(*aa,*bb): // : instead of ; 
4

Ну, вы используете C или C++? У вас есть действующая программа на C (минус опечатка : вместо ;). Но вы назовете его «.cpp» и изначально отметили вопрос только «C++» (теперь он исправлен). Если вы не скажете об этом иначе, компилятор Visual Studio скомпилирует файлы «.cpp» как C++. И ваша программа недействительна C++.

В C++ вы использовали бы std::sort, а не qsort. Он имеет другой интерфейс, и const void* не нужен. Тогда ваша проблема исчезнет.

+0

OP использует Visual Studio, а не GCC. И Visual Studio не поставляется с компилятором C вообще! Он знает только C++. Все, что вы можете сделать, это переключить параметр проекта, который запретит некоторые функции C++ для имитации подмножества C на C++ (и, возможно, разрешить более мягкие преобразования указателей? Dunno). –

+1

Извините, мой плохой. VS2008 имеет режим C89, '/ TC' - который по умолчанию используется для файлов' .C'. – MSalters

+2

@ Konrad: Это неверно. Компилятор MSVC является компилятором C и C++ и использует компиляторы и/или расширение исходного файла, чтобы определить, какой язык компилировать. Как выяснил OP, существуют C-конструкции, недопустимые в C++. –

0

Try замена:

int comp(const void *a, const void *b){ 
    char *const *aa=a; 
    char *const *bb=b; 
    return strcmp(*aa,*bb): 
} 

с:

int comp(const void *a, const void *b){ 
    const char* aa = (const char*)a; 
    const char* bb= (const char*)b; 
    return strcmp(*aa,*bb): 
} 

..разработать решить проблему преобразования указателя.

4

В C++ используйте sort вместо qsort. Кроме того, элементы argv не должны быть мутированы, поскольку они (неявно, для обратной совместимости C) объявлены const. Таким образом, вам нужно скопировать их куда-нибудь еще: (. По-видимому, не верно)

#include <string> 
#include <vector> 
#include <algorithm> // for sort 

int main(int argc, char const* argv[]) { 
    std::vector<std::string> args(argv, argv + argc); 
    std::sort(args.begin(), args.end()); 
} 

(Обратите внимание, что это решение использует string и vector вместо строк C и массивов C-типа, где это возможно, что это не обязательно, но. делает код намного проще и короче.)

+0

Почему «argv» не может быть изменен? Конечно, не может быть обратной совместимости с C: стандарты C89 и C99 явно допускают модификацию 'argv' (раздел 5.1.2.2.1/2 в стандарте C99). Я не могу найти что-либо в стандарте C++ 98, но я ничего не вижу об этом в разделе «C-совместимость». – jamesdlin

+0

@jamesdlin: Я думаю, что, возможно, я предполагал, что, даже не глядя на него, поскольку C++ позволяет объявлять 'argv' как' char const * [] '(или делает это?), А так как строковые литералы C неявно' const '. Спасибо, что указал на эту ошибку. –

+1

Цитата из стандарта 'C' (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n869/n869.txt.gz) n869.txt 5.1.2.2.1 (акцент мой). «Параметры argc и argv и строки, на которые указывает массив argv **, могут быть модифицированы программой ** и сохраняют свои последние сохраненные значения между запуском программы и завершением программы». – pmg