Avatar billede evilfish Nybegynder
02. juni 2008 - 09:35 Der er 15 kommentarer og
1 løsning

Function pointer problemer

Hej eksperter.

Dette problem jeg forklare lige om lidt, er ved at gå mig på nerverne. Jeg har søgt og spurgt i snart alle dele på nettet.

Jeg har lagt en paste på nettet hvis i vil se det der.
http://cpp.ninjacodemonkeys.org/4454
Men jeg skriver det hele ned her alligevel:

Jeg får følgende fejl:
Simulator.cc:31: error: argument of type ‘void* (Simulator::)(void*)’ does not match ‘void* (*)(void*)’

Af hvad jeg kan forstå er det en function pointer jeg er gået galt i. Jeg aner bare ikke hvad jeg skal se efter i min kode:

void Simulator::runSimulator(int i)
{
    runNumOfTimes = i;
    isSimulatorRunning = true;
    pthread_create( &simThread, NULL, execute, NULL); <-- Det er her den fejler.
}

Jeg leder IKKE efter sider hvor jeg kan læse om function pointers, for det er det eneste jeg har fået. Jeg er drunknet i bog forslag og links. Nu leder jeg efter hvorfor det fejler. og Hvor det fejler. Når jeg ved det, kan jeg forstå mit problem, og læse op på det.
[OFFTOPIC]
Undskyld jeg lyder lidt pessimistisk, men 2½ time med folk der skriver: "LÆS SELV OP PÅ DET" har ikke hjulpet meget på mit humør
[/OFFTOPIC]

På forhånd tak
Avatar billede segmose Nybegynder
02. juni 2008 - 11:33 #1
Simulator.cc:31: error: argument of type ‘void* (Simulator::)(void*)’ does not match ‘void* (*)(void*)’

Siger at simThread er member af en class og pthread_create vil have en ikke-member.

Se pkt. 33.2 (Ja jeg ved godt du ikke bad om en side :) ) Der er en opskrift og forklaring på dit problem.

http://www.parashift.com/c++-faq-lite/pointers-to-members.html
Avatar billede evilfish Nybegynder
02. juni 2008 - 12:30 #2
Du er så den første der har præsteret at give materiale der forklarer problemet ret godt. Skal lige kigge lidt mere ind i det...
Avatar billede evilfish Nybegynder
02. juni 2008 - 12:36 #3
Hmm - Jeg tror jeg har bygget mit forkert op. Jeg forsøger at få min klasse (simulator) til at blive kørt som en tråd. Lidt lige som Java. Ved ikke om jeg har skudt helt forbi her?
Avatar billede segmose Nybegynder
02. juni 2008 - 12:48 #4
Ja, jeg kan ikke rigtig sige noget om Java.
Kan du forklare hvorfor du vil have det som en klasse? hvis der kun er en ting du vil simulere af gangen så se bort fra det uskønne i det globale funktions kald.
Avatar billede evilfish Nybegynder
02. juni 2008 - 12:55 #5
Min simulator tager en anden klasse jeg har lavet som parameter. Den klasse laver en rapport fil med data. Simulater laver den data. Jeg skal have simulator til at lægge data ind i den rapport hvert sekund, med mulighed for at starte og stoppe den når det ønskes.
Avatar billede segmose Nybegynder
02. juni 2008 - 13:12 #6
Så burde løsningen i 33.2 kunne bruges.
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:29 #7
Jeg har svært ved at se hvor jeg skal indsætte den løsning, grundet deres løsning ligge ude af deres klasse. Og jeg ved ikke om jeg skal gøre det samme. Det jeg har indil videre er: http://cpp.ninjacodemonkeys.org/4456
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:30 #8
Vent lidt med at kommentere. Tror jeg har den
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:36 #9
Static på min execute virkede så fejlen forsvandt, men nu kan jeg så ikke få adgang til objektet når programmet køres. Den fejler på først linie af runSimulator
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:38 #10
Okay, Nu kører det faktisk ok. Skal dog lige finde ud af hvordan jeg udvider det. Men indtil videre virker det ret godt
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:43 #11
Okay - Hvis jeg gør den statisk. Hvordan får jeg så fat i de andre metoder?
Avatar billede segmose Nybegynder
02. juni 2008 - 13:54 #12
Jeg havde troet du ville hoppe på denne løsning hvor du så får adgang til de øvrige funktioner da der er et object tilkoblet, hvor static ikke har et object.

Fred* object_which_will_handle_signal;

void Fred_memberFn_wrapper()
{
  object_which_will_handle_signal->memberFn();
}

...
Fred = ditObject;
Avatar billede evilfish Nybegynder
02. juni 2008 - 13:56 #13
Mit problem ligger i jeg ikek forstår hvor Fred* object_which_will_handle_signal; bliver initialiseret
Avatar billede evilfish Nybegynder
02. juni 2008 - 14:02 #14
Og jeg forstår godt ideen. Men min pthread_create laver så bare stadig den samme fejl
Avatar billede segmose Nybegynder
02. juni 2008 - 14:16 #15
Fred* object_which_will_handle_signal;

void *Fred_memberFn_wrapper(void *xxx)
{
  object_which_will_handle_signal->memberFn();
}

... et andet sted.
Fred = ditObject;

void Simulator::runSimulator(int i)
{
    runNumOfTimes = i;
    isSimulatorRunning = true;
    pthread_create( &Fred_memberFn_wrapper, NULL, execute, NULL); <-- Det er her den fejler.
}

Du har nu det ovenstående og det virker ikke?
jeg har tilrettet Fred_memberFn_wrapper så den nu er en void* (*)(void*)
Avatar billede evilfish Nybegynder
03. juni 2008 - 11:29 #16
Jeg skal lige se om det virker. Du giver mening vil jeg sige.
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