Avatar billede hurra Novice
02. november 2004 - 14:12 Der er 6 kommentarer og
1 løsning

Hvor mange indput har funktionen

Jeg har en funktion jeg kalder med en pointer til en anden funktion. Nu har jeg brug for i nogle tilfælde at callback funktionen har 1 parameter, og i andre tilfælde 2 parametre.

Da jeg skal bruge det her andre steder har jeg desværre ikke mulighed for at ændre min kode "væk" fra 1 parameters løsningen, men istedet for skal 2 parameter løsningen være en option.

Kan man lave noget lige som "safe typecast", med funktioner ? fx:
if( statusfunc == <void status(int id, int error)>
.....
else if( statusfunc == <void status(int error)>
.......
Avatar billede arne_v Ekspert
02. november 2004 - 14:29 #1
Hvis det er C kan du vel bare erklære den uden argumenter, så kan du kalde
den med det antal argumenter som du vil.

Hvsi det er C++ kan du muligvis bruge variabelt antal argumenter featuren
med ... (altså 3 punktummer).
Avatar billede hurra Novice
02. november 2004 - 14:32 #2
jeg har lavet det her nu, og det kan kombileres, men desværre har jeg ikke lige mulighed for at teste det lige nu. Jeg vil gerne ha kommentare på det aligevel hvis der er noget der ved det ikke virker, eller hvis i ved noget der er bedre. Jeg vender også tilbage med en status når jeg har prøvet det af:

      StatusFuncId *status = dynamic_cast<StatusFuncId*>(ProgramStatus)
      if(status)
        status(Id, Error);
      else
        ProgramStatus();

Der ud over har jeg defineret:
  typedef void CALLBACK StatusFunc(bool error);
  typedef void CALLBACK StatusFuncId(SessionIDType id, bool error);
Avatar billede hurra Novice
02. november 2004 - 14:33 #3
Endnu en gang tak for et hurtigt svar arne_v. Det er c++.
Avatar billede arne_v Ekspert
02. november 2004 - 19:33 #4
Eksempel med ...:

#include <iostream>

using namespace std;

typedef void (*callbackfunc)(...);

void p(int ix, callbackfunc *f)
{
    if(ix < 1)
    {
        f[ix](1);
    }
    else
    {
        f[ix](1,2);
    }
}

void f1(int a)
{
    cout << "f1: " << a << endl;
}

void f2(int a,int b)
{
    cout << "f2: " << a << " " << b << endl;
}

int main()
{
    callbackfunc f[2];
    f[0] = (callbackfunc)f1;
    f[1] = (callbackfunc)f2;
    for(int i = 0; i < 2; i++) p(i, f);
    return 0;
}
Avatar billede arne_v Ekspert
02. november 2004 - 19:34 #5
Koden er bizar.

Men den virker tilsyneladende fint.
Avatar billede arne_v Ekspert
21. november 2004 - 20:36 #6
OK ?
Avatar billede hurra Novice
21. november 2004 - 21:30 #7
Undskyld, vente tiden. Ja jeg går ud fra det er ok, men jeg har desværre endnu ikke fået det afprøvet da jeg vendter på det hardware programmet skal bruges til. Men jeg har fået kombileret og simuleret en lille smule og det ser ud til at virke sådan som jeg beskrev det i min første kommentar.

Men stadig en stor tak og så lukker jeg for denne gang.
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