Ved hjelp av mange argumenter uten å duplisere kode

stemmer
1

Er det en måte å bruke hver av argumentene i denne funksjonen i rekkefølge uten å duplisere koden? For eksempel, den første gang sløyfen jeg ønsker å bruke R, neste gang jeg ønsker å bruke L, etc. Det valuestruct satt opp i den samme rekkefølge som de argumenter, slik at knappen fremgangsmåten returnere den tilsvar bool jeg trenger for currentbutton henhold til int i. Hvis det er en bedre metode for å oppnå det samme som er ok også.

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) {

        bool value[4] = {true, false, true, false};
        bool currentbutton;

        for (int i=0; i < 12; i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                I want to grab each argument in sequence here=value[valuex];
                valuex++;
                if(valuex>ARRAYSIZE(value))
                    valuex=0;
            }
        }
    }
Publisert på 09/04/2009 klokken 07:12
kilden bruker
På andre språk...                            


6 svar

stemmer
3

Har du vurdert å bruke en bool array? :) En samling er definitivt veien å gå. Hvis du trenger å beholde metadata for filtrering eller gripe visse verdier, vurdere å bruke et kart.

Svarte 09/04/2009 kl. 07:14
kilden bruker

stemmer
0

Du kan sette argumentene til en matrise og passere matrise i stedet. Avhengig av hva kaller kode er dette kan føre til mindre kode.

Svarte 09/04/2009 kl. 07:14
kilden bruker

stemmer
1

Du kan bruke variabelen argument støtte, siden du har et fast antall argumenter du vet hvor mye du skal sløyfe på. IIRC den ikke faktisk krever at funksjonen har variable argumenter.

va_list args;                                                                                                     
va_start(args,R);
// your code here...
va_end();

Tilgi meg hvis dette er utenfor basen ... det har gått noen år siden jeg aktivt kodet C.

Svarte 09/04/2009 kl. 07:33
kilden bruker

stemmer
3

Eller en bit felt ? Rask og skitne versjon:

int field = FLAG_R | FLAG_L

void SetValue(int fields) {
    for (int i = 0; i < FLAG_COUNT; i++) {
        if (fields & (1 << i)) {
            // Flag #i is set
        }
    }
}

REDIGERE

Btw, passerer bools som referanse er ubrukelig hvis du ikke endre verdien. Pekeren som brukes for referanse er muligens lenger enn den type som holder bool selv.

Svarte 09/04/2009 kl. 07:33
kilden bruker

stemmer
4

Hvis du virkelig insisterer på denne funksjonen prototype (og ikke følge de andre forslagene her for å sende en matrise eller en liste - som er bedre), kan du bruke noe sånt -

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F)
{
   bool* Bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };

   // *Bools[i] can be used to access the ith element.

   // Print the 4th element.
   std::cout << *Bools[3];

   // Change the value of the 5th.
   *Bools[4] = true;
}

Forresten, hvis du ikke virkelig trenger å endre passerte verdier, bør du ikke sende dem som referanse. Passerer en bool ved henvisning bare bortkastet tid og rom. Det vil også gjøre koden her litt mindre rotete.

Svarte 09/04/2009 kl. 07:33
kilden bruker

stemmer
1

Jeg vil legge dette til seks svar, men jeg kan ikke redigere innleggene ennå.

int valuex=0;

void SetValue(bool &R,bool &L,bool &D,bool &U,bool &T,bool &S,bool &B,bool &A
             ,bool &Y,bool &X,bool &W,bool &E,bool &G, bool &F) 
{
    bool* bools[] = { &R, &L, &D, &U, &T, &S, &B, &A, &Y, &X, &W, &E, &G, &F };
    bool value[4] = {true, false, true, false};
    bool currentbutton;

    for (int i=0; i<12 && i < ARRAYSIZE(bools); i++) {
            currentbutton=valuestruct.button(i);

            if(currentbutton) {
                    *bools[i]=value[valuex];
                    valuex++;
                    if(valuex>ARRAYSIZE(value))
                            valuex=0;
            }
    }
}

Selv om jeg ikke forstår hvor det er antatt at du bare vil lese verdien av bools, du bare ikke kan sette dem alle.

Svarte 09/04/2009 kl. 09:02
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more