Avatar billede heyn Nybegynder
16. maj 2013 - 16:03 Der er 10 kommentarer og
1 løsning

Om anvendelse af argv i switch, og hvordan man overfører den til en funktion

Hej Eksperter

Jeg har et program hvor man skal tilføje 2 argumenter argv[1]  argv[2].

Indtil nu har jeg brugt tal, og så giver det jo ingen problemer i et switch statement. Jeg skal bare skrive switch (atoi(argv[1]))

Nu er der virkelig mange muligheder for argv[1] og der vil sikkert komme flere i fremtiden, så jeg ville gerne for overskuelighedens skyld vælge på en tekst.
F.eks. hvis argv[1] er lig med "open" at jeg så kan skrive
case: "open".

Men jeg kan jo ikke skrive switch (argv[1]) da argv[1] er en pointer. Istedet må jeg lave en lang række af else if (!strcmp("transaction",argv[1])), og det ser ikke særlig overskueligt ud.

Endnu mere kompliceret bliver det hvis argv[1] = "admin" for så er der yderlig mange muligheder for værdien af argv[2].

Derfor ville jeg også gerne have en funktion i a la
function case_admin(argv[2])
som varetager denne specielle situation.
Men hvordan overfører man argv[2] i funktionen?

Kender nogen en måde til at gøre en streng til et unict tal?

Christian
Avatar billede arne_v Ekspert
16. maj 2013 - 16:21 #1
Jeg ville nok:
* definere en enum
* lave en funktion som konverterede streng til enum via if og strcmp
* lave switch paa enum
Avatar billede heyn Nybegynder
16. maj 2013 - 17:12 #2
Jeg har faktisk allerede en defineret
typedef enum ADMIN_E
{
    ADMIN_ENDOFDAY = 1,
    ...
    ...
    ...
} FLX_ADMIN_FUNCTION;

Disse er trods alt ret sigende for hvilken funktion det er.
Mit problem har bare været at jeg ikke kender tricket til hvordan jeg vælger
FLX_ADMIN_FUNCTION admin_func = ADMIN_END_OF_DAY

hvis argv[2] = "ADMIN_END_OF_DAY"

El. mere generelt

Hvordan jeg får lavet argv[2] om til en konstant af typen FLX_ADMIN_FUNCTION

Christian
Avatar billede arne_v Ekspert
16. maj 2013 - 17:20 #3
nestede if saetninger med strcmp
Avatar billede arne_v Ekspert
17. maj 2013 - 01:58 #4
FLX_ADMIN_FUNCTION admin_func;
if(strcmp(argv[2], "ADMIN_END_OF_DAY")==0)
{
    admin_func = ADMIN_END_OF_DAY;
} else if(strcmp(argv[2], "FOOBAR")==0)
    admin_func = FOOBAR;
...
Avatar billede heyn Nybegynder
17. maj 2013 - 09:19 #5
OK - Jeg slipper ikke for if else if else if else ...
Der findes altså ikke noget trick hvormed man kan bruge en tekststreng som nøgleværdi i et array som kan i PHP.

I PHP ville jeg jo bare have lavet et array
$func = array( "ADMIN_END_OF_DAY" => 1, ... )

Christian
Avatar billede segmose Nybegynder
17. maj 2013 - 22:20 #6
Hvis du vil lave sådan noget så skal du nok kikke på

std::map

for tekst skal du dog også lave en compare da den ellers bare ser på pointeren.
Avatar billede arne_v Ekspert
17. maj 2013 - 23:21 #7
I C skal det laves selv. Men det kan man godt.

I C++ er der flere muligheder.
Avatar billede arne_v Ekspert
18. maj 2013 - 02:07 #8
Hvis antallet er fast kan du lave et trick via en macro.
Avatar billede heyn Nybegynder
25. juni 2013 - 08:24 #9
Tak. Smider du et svar?
Avatar billede heyn Nybegynder
25. juni 2013 - 08:25 #10
P.s. - Du har været mig til stor hjælp. Nu er jeg ved atter at få lidt styr på C. Vi laver sluttest en af dagene.
Avatar billede arne_v Ekspert
25. juni 2013 - 14:36 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester