Avatar billede Lasse Novice
24. oktober 2001 - 19:30 Der er 21 kommentarer og
2 løsninger

gris gris gris

Jeg har foelgende:

    bool CreateInMemoryDirectoryOnServer();
    bool PrepareFiles();
    bool updateScreen();
    bool CreateTmpINIFile();
    bool CreateDirectoryOnServer();
    bool MoveFiles();
    bool RemoveDirectoryOnClient();
    bool ChangeDirectoryOnServerToOK();
    bool compareINIToDirectory();
    bool RemoveTmpINIFile();
   
    bool (*pfun[10])() = { CreateInMemoryDirectoryOnServer, PrepareFiles, updateScreen, CreateTmpINIFile, CreateDirectoryOnServer, MoveFiles, RemoveDirectoryOnClient, ChangeDirectoryOnServerToOK, compareINIToDirectory, RemoveTmpINIFile };

Alt dette ligger i en klasse som private medlemmer...

Men der kommer en fejl... Den kan ikke lide at jeg saetter variablen lig en vaerdi. Derfor vil jeg proeve at ligge erklaeringen herunder variable erklaeringen ogsaa saette den i konstruktoren... Men det ved jeg ikke hvordan man goer....

HJAELLPPPP
Avatar billede stigc Nybegynder
24. oktober 2001 - 20:00 #1
er det  det her den ikke kan li\'?


bool (*pfun[10])() = { CreateInMemoryDirectoryOnServer, PrepareFiles, updateScreen, CreateTmpINIFile, CreateDirectoryOnServer, MoveFiles, RemoveDirectoryOnClient, ChangeDirectoryOnServerToOK, compareINIToDirectory, RemoveTmpINIFile };

Det er et array af funktioner, de kan ikke sættes lig med en værdi.....

Er ikke helt sikker på hvad du mener
Avatar billede Lasse Novice
24. oktober 2001 - 20:02 #2
Jeg proever at lave et array af pointers til funktioner
Avatar billede Lasse Novice
24. oktober 2001 - 20:05 #3
Avatar billede Lasse Novice
24. oktober 2001 - 20:17 #4
men, ja, det er det den ikke kan lide...
Avatar billede Lasse Novice
24. oktober 2001 - 23:44 #5
dette er fejlen jeg faar

error C2440: \'=\' : cannot convert from \'bool (__thiscall client2server::*)(void)\' to \'bool (__cdecl *)(void)\'
        There is no context in which this conversion is possible

Hvis jeg goer det SIMPELT som herunder:

bool (*pfun)() = 0;
    pfun = updateScreen;
Avatar billede soepro Nybegynder
25. oktober 2001 - 11:07 #6
Det er placeringen af array-størrelsen der er problemet:

typedef boolFuncPtr = bool (*)(void);

boolFuncPtr pFun[10] = { alle dine funktioner };

vil virke.
Avatar billede soepro Nybegynder
25. oktober 2001 - 11:23 #7
sorry typedef\'en skal selvfølgelig se sådanher ud:

typedef bool (*boolFuncPtr)(void);
Avatar billede Lasse Novice
25. oktober 2001 - 17:30 #8
ja, det forstaar jeg saaden set ikke noget af... Jeg er ikke nogen haj til C, men kunne du proeve at forklare mig forskellen UDEN og MED typedef
Avatar billede Lasse Novice
25. oktober 2001 - 17:38 #9
Ja, lige naar jeg laeser om det i en c++ bog, saa staar der at der INGEN forskel er... Men at det kan bruges lidt som CSS.... Aendre eet sted, istedet for mange
Avatar billede Lasse Novice
25. oktober 2001 - 17:59 #10
Er nu efterproevet, og det virker ikke :-(
Avatar billede Lasse Novice
25. oktober 2001 - 18:26 #11
nu faar jeg en anden fejlmeddelelse...
error C2440: \'initializing\' : cannot convert from \'\' to \'bool (__cdecl *)(void)\'
        None of the functions with this name in scope match the target type
Avatar billede soepro Nybegynder
25. oktober 2001 - 19:11 #12
Dette her er taget direkte fra den kode jeg lavede, som både compilerer og virker:

bool f1(void) { return false; };
bool f2(void) { return false; };
bool f3(void) { return false; };
bool f4(void) { return true;  };
bool f5(void) { return false; };
bool f6(void) { return false; };
bool f7(void) { return false; };
bool f8(void) { return false; };
bool f9(void) { return false; };
bool f10(void) { return false; };

typedef bool (*boolFuncPtr)(void);

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  boolFuncPtr pFun[10] = { f1, f2, f3, f4, f5, f6, f7, f8, f9, f10 };
  AnsiString theCaption = \"\";
  for (int idx = 0; idx < 10; idx++)
  {
    if (pFun[idx]())
      theCaption += \"true \";
    else
      theCaption += \"false \";
  };
  Label1->Caption = theCaption;
}
Avatar billede soepro Nybegynder
25. oktober 2001 - 19:13 #13
Og skulle selvfølgelig være et svar !

bool f1(void) { return false; };
bool f2(void) { return false; };
bool f3(void) { return false; };
bool f4(void) { return true;  };
bool f5(void) { return false; };
bool f6(void) { return false; };
bool f7(void) { return false; };
bool f8(void) { return false; };
bool f9(void) { return false; };
bool f10(void) { return false; };

typedef bool (*boolFuncPtr)(void);


__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  boolFuncPtr pFun[10] = { f1, f2, f3, f4, f5, f6, f7, f8, f9, f10 };
  AnsiString theCaption = \"\";
  for (int idx = 0; idx < 10; idx++)
  {
    if (pFun[idx]())
      theCaption += \"true \";
    else
      theCaption += \"false \";
  };
  Label1->Caption = theCaption;
}
Avatar billede Lasse Novice
25. oktober 2001 - 20:45 #14
ok, den eneste forskel jeg kan se der er, er at funktiones erklaeringerne i min kode ligger i header filen ... (vc++ dialog baseret)
Avatar billede Lasse Novice
26. oktober 2001 - 00:10 #15
jo, forskellen er at de funktioner som du ligger i dit array IKKE er memberfunktioner til klassen.
Avatar billede joha Nybegynder
26. oktober 2001 - 00:52 #16
Din function-pointer er forkert:
bool (*pfun[10])() = { ... }  /* nej for this-pointeren skal med så svaret er: */

bool (KLASSE_NAVN::*pfun[10])() = { ... }

Det virker i VC++6.0!!!
Avatar billede soepro Nybegynder
26. oktober 2001 - 10:26 #17
gooky >> man får svar som man spørger ! hvis de funktioner der skal gemmes i tabellen er memberfunktioner, er joha\'s svar det rigtige.

(Det er kutume at fordele point -ikke ligeligt- til dem der svarer - ikke at afvise alle svar !!!)
Avatar billede Lasse Novice
26. oktober 2001 - 18:11 #18
ok... Hvis du gerne vil have point for at svare forkert, skal du da nok faa nogen.. Men for at retfaerdiggoere mine aktioner, saa kan vi jo starte med at laese mit primaere spoergsmaal...

bla bla bla bla bla....

Alt dette ligger i en klasse som private medlemmer...

bla bla bla bla bla....

Det retfaerdiggoerer vist mine aktioner...

Saa skrev jeg senere under dette spg. at dette var en reference:

se evt. http://www.eksperten.dk/spm/124808

hvilket indeholder dit senere svar... Ja, jeg vil ikke til at blive sur, jeg vil bare gerne lige forklare mine aktioner...

Anyway, jeg vil da gerne give dig nogen point...
Avatar billede Lasse Novice
26. oktober 2001 - 20:05 #19
joha...
der kommer ingen compilerings error naar jeg i compiler den nu... laekkert
MEN... har du proevet at eksekvere funktionerne??? Det virker ikke lige... Den skriver:

term does not evaluate to a function

Jeg har skrevet foelgende:

bool (client2server::*pfun[1])() = { updateScreen };
pfun[0]();

Avatar billede joha Nybegynder
27. oktober 2001 - 03:31 #20
Ups jeg burde have forklaret hvordan du kalder din funktion. Syntaksen som er lidt mærkelig lyder som følger:

// I din klasse kalder du funktionen som:
this->*pfun[1])();

Jeg kan ikke huske hvorfor denne GRIMME syntaks er nødvendig, men der er sikkeret en forklaring
~joha~
Avatar billede Lasse Novice
29. oktober 2001 - 17:10 #21
Ja, det ser udtil at virke... Men der mangler lige et lille sidste touch...
... oprette variablen under klasseerklaeringen og derefter fyld variablen under konstruktoren, saa den kan bruges i en funktion...
Avatar billede Lasse Novice
29. oktober 2001 - 17:14 #22
naaa, den fik jeg sku selv lige regnet ud...

Ogsaa til at give point... Jeg har jo lovet soepro at give ham nogle point fordi han svarede i syd mens jeg spurgte i nord... saa her er point fordelingen...
Avatar billede Lasse Novice
29. oktober 2001 - 17:17 #23
bortset fra det.... takker for hjaelpen alle sammen
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