2010-08-10 10 views
0

Voici ce que j'ai:Comment utiliser TCHAR * Fourni dans l'argument de ligne Cmd dans Switch Statement?

switch(argv[0]) 
{ 
    case "-test1": 
    AfxBeginThread(method1, 0); break; 
    case "-test2": 
    AfxBeginThread(method2, 0); break; 
    case "-test3": 
    AfxBeginThread(method3, 0); break; 
    default: 
    AfxBeginThread(method1, 0); break; 
} 

J'utilise les fenêtres pour que les arguments entrent en l 'tableau en tant que TCHAR *. Que dois-je faire pour que cela fonctionne?

Edit:

Je suis en train de faire ce qui suit maintenant ...

if(strcmp(argv[0], "-http") == 0) 
    doStuff(); 

Je reçois l'erreur suivante compilation

erreur C2664: 'strcmp': ne peut pas convertir le paramètre 1 de 'TCHAR *' en 'const char *' Les types pointés sur ne sont pas liés; La conversion nécessite reinterpret_cast, un cast de style C ou un cast de style fonction.

Aide?

+0

Pouvez-vous être plus précis?Qu'est-ce qui ne fonctionne pas maintenant? Compiler l'erreur? Erreur d'exécution? Erreur logique? –

+0

@Alex Zylman: "expression intégrale requise" – SigTerm

+0

@SigTerm: Vous devriez écouter les messages d'erreur que votre compilateur vous donne. Comme James l'a dit dans sa réponse, les cas de changement en C/C++ n'acceptent que les types entiers. C'est aussi la même erreur que votre compilateur vous donne. –

Répondre

5

Vous ne pouvez pas passer sur les valeurs qui ne sont pas des valeurs constantes entières. Mais puisque la correspondance des arguments n'est pas critique dans le temps, vous pouvez mettre quelques if et strcmp à la place.

Ce code fonctionne apparemment sous Windows, vous êtes très probablement obligé d'utiliser TCHAR, ce qui signifie que vous avez besoin _tcscmp() au lieu de strcmp, et le bon vieux _T() macro:

if  (_tcscmp(_T("-test1"),argv[0])==0) AfxBeginThread(method1, 0); 
else if (_tcscmp(_T("-test2"),argv[0])==0) AfxBeginThread(method2, 0); 
else if (_tcscmp(_T("-test3"),argv[0])==0) AfxBeginThread(method3, 0); 
else AfxBeginThread(method1, 0); 

La chose TCHAR, _tcscmp et _T() est expliqué ici:

La petite histoire est, que vous pouvez construire votre programme pour diverses représentations de caractères (UCS-2 16 bits, multi-octets 8 bits, etc.) à partir d'une source unique en utilisant ces macros, qui s'étendent à la fonction (_tcscmp->strcmp or wcscmp or mbccmp) de la représentation du personnage pour laquelle vous construisez.

+0

Cela a fonctionné, mais j'ai dû le faire argv [1] au lieu de argv [0]. Je suppose que le premier est réservé. Merci! En outre, j'ai remarqué que mon application utilise wchar plutôt que des caractères normaux. Je cours XP. Ne devrait-il pas utiliser ASCII par défaut pas UNICODE? – themaestro

4

Cela ne fonctionnera pas. En C/C++, switch ne fonctionne qu'avec des types entiers.

Dans d'autres langues (VB, C#), vous pouvez utiliser tout type de données dans une instruction switch, mais en C & C++, vous ne pouvez utiliser les types entiers (int, long, char etc).

La raison en est que lorsque vous utilisez ints, il existe une optimisation disponible en utilisant if() chaîné. switch a été créé pour tirer parti de cette optimisation. Plus tard, les gens se sont rendus compte que cela rendait le code plus clair, et l'a ajouté à d'autres langages - mais juste comme un raccourci pour if() s - sans tirer parti de l'optimisation.

2

Que dois-je faire pour que cela fonctionne?

Quelque chose comme ceci:

// Beware, un-compiled code ahead! 
namespace { 
    typedef std::map<std::basic_string<TCHAR>,AFX_THREADPROC> thread_func_map_type; 
    typedef thread_func_map_type::value_type thread_func_entry_type; 

    const thread_func_entry_type thread_func_entries[] = 
    { thread_func_entry_type(_T("-test1"), method1) 
    , thread_func_entry_type(_T("-test2"), method2) 
    , thread_func_entry_type(_T("-test3"), method3) }; 

    const thread_func_map_type thread_func_map(thread_func_entries 
              , thread_func_entries 
              + thread_func_entries 
              /thread_func_entries[0]); 
} 

// ... 

thread_func_map_type::const_iterator it = thread_func_map.find(argv[1]); 
if(it == thread_func_map.end()) 
    it = thread_func_map.find("-test1"); 
assert(it!=thread_func_map.end()); 
AfxBeginThread(it->second, 0); 
+0

heh - Je ne faisais que coder une variante C de ceci (trop de travail embarqué ...) –

+0

Ceci n'aborde pas le problème de TCHAR. –

+0

@Adrian: Vous avez raison, j'ai oublié à ce sujet! C'est maintenant réparé. – sbi