Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-10-2007, 09:26   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
[C++] Array di puntatori a funzione

Salve ragazzi, ho un problema nel creare un array di puntatori a funzione. Partendo dalla definizione del tipo :

typedef float (*PointerFunction)(float);

Come creo ed inizializzo un array dinamico di puntatori a funzione, le quali funzioni prendono e restituiscono un float?

Grazie.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09:32   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Unrue Guarda i messaggi
ho un problema nel creare un array di puntatori a funzione. Partendo dalla definizione del tipo :

typedef float (*PointerFunction)(float);

Come creo ed inizializzo un array dinamico di puntatori a funzione, le quali funzioni prendono e restituiscono un float?
Se vuoi allocare dinamicamente l'array con new (visto che parli di C++), date ad esempio due funzioni:

Codice:
float func1 (float f)
{
    ....
}

float func2 (float f)
{
    ....
}

...

PointerFunction *pf = new PointerFunction[2];

pf[0] = func1;
pf[1] = func2;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09:39   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Così ho provato, però mi dice :

"Argument of type float(NomeClasse:: )float does not match float(*)(float) ";

La funzione membro alla quale voglio collegarlo è del tipo float Nomefunzione(float);

Quindi non capisco perchè dica questa cosa.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09:58   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Unrue Guarda i messaggi
La funzione membro alla quale voglio collegarlo è del tipo float Nomefunzione(float);
No alt aspetta. Parli di una funzione membro di una classe??? No non è la stessa cosa (e il 'this' che fine farebbe? ).

Sono un po' "arruginito" per il C++ ma credo che non si possa fare. Si potrebbe fare, se non sbaglio, se la funzione membro è 'static'.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09:58   #5
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Così ho provato, però mi dice :

"Argument of type float(NomeClasse:: )float does not match float(*)(float) ";

La funzione membro alla quale voglio collegarlo è del tipo float Nomefunzione(float);

Quindi non capisco perchè dica questa cosa.
Allora non vuoi un puntatore a funzione ma un puntatore a metodo.
che si dichiara con:

typedef float (NomeClasse::*PointerFunction)(float);
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09:59   #6
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Ah ecco,quindi dovrei dichiarare le funzioni static. Però in realtà non è necessario che lo siano,per quanto riguarda il design dell'applicazione metterei static solo per fare questa cosa.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10:04   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Allora non vuoi un puntatore a funzione ma un puntatore a metodo.
che si dichiara con:

typedef float (NomeClasse::*PointerFunction)(float);
Così funziona!

Poi l'assegnamento lo faccio con :

array_func_experts[0]=&NomeClasse::nomefunzione;
...

Grazie!!
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10:07   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
No mi correggo, si può fare:

Codice:
class Prova
{
public:
    void test (void) { cout << "hello" << endl; }
};

typedef void (Prova::*ptr) (void);
poi ad esempio:

Codice:
ptr p = &Prova::test;
Prova prova;

(prova.*p) ();

(io comunque eviterei menate del genere ..... anzi eviterei del tutto il C++ )
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10:28   #9
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da andbin Guarda i messaggi
No alt aspetta. Parli di una funzione membro di una classe??? No non è la stessa cosa (e il 'this' che fine farebbe? ).

Sono un po' "arruginito" per il C++ ma credo che non si possa fare. Si potrebbe fare, se non sbaglio, se la funzione membro è 'static'.
Lo puoi fare anche se i metodi non sono static, ci mancherebbe, se però imposti il puntatore ad un metodo di una classe non istanziata, non c'è try/catch che ti salvi.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10:38   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Lo puoi fare anche se i metodi non sono static
Infatti ... mi sono ricordato, grazie.
Io comunque tifo per Java ... non per C++.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:17   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Allora ragazzi, adesso ho il problema di invocare queste funzioni!

Ho provato così :

Puntatoreclasse->array_funzioni[0](float di ingresso);

Ma non funziona. Come si invoca? Tenete conto che lo sto invocando da un'altra classe, non da quella da cui l'ho definito.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:25   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Allora ragazzi, adesso ho il problema di invocare queste funzioni!

Ho provato così :

Puntatoreclasse->array_funzioni[0](float di ingresso);

Ma non funziona. Come si invoca?
Vedi il mio esempio sopra.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:29   #13
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Allora ragazzi, adesso ho il problema di invocare queste funzioni!

Ho provato così :

Puntatoreclasse->array_funzioni[0](float di ingresso);

Ma non funziona. Come si invoca? Tenete conto che lo sto invocando da un'altra classe, non da quella da cui l'ho definito.
Gli operatori per puntatori a metodo sono ->* e .*
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:30   #14
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Gli operatori per puntatori a metodo sono ->* e .*
Ho provato :

Codice:
Puntatoreclasse->*(array_punt_funzioni[0]))(ingresso);
Ma non funziona
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:32   #15
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Provato anche questo, ma nulla :

Codice:
(Puntatoreclasse->*array_punt_funzione[0])(ingresso)
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:33   #16
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da andbin Guarda i messaggi
Infatti ... mi sono ricordato, grazie.
Io comunque tifo per Java ... non per C++.
Vabbè, ma altrimenti come fai a far comunicare le classi C++ tra di loro?

Inoltre si può scaricare l'header fastdelegate da codeproject che rende la sintassi più leggibile e decisamente più comoda da usare.
Assegni i puntatori a metodo con MakeDelegate(this,&NomeClasse::Metodo) e puoi usare indifferentemente puntatori a funzione e a metodo.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:34   #17
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Provato anche questo, ma nulla :

Codice:
(Puntatoreclasse->*array_punt_funzione[0])(ingresso)
Potresti postare il codice?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:36   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Potresti postare il codice?
Il codice è piuttosto grande, cosa ti serve di preciso?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 11:40   #19
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Il codice è piuttosto grande, cosa ti serve di preciso?
il punto in cui dichiari array_punt_funzione e Puntatoreclasse, anche per capire se la dichiarazione di Puntatoreclasse ha senso rispetto a quello che vuoi fare.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 12:10   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6450
Ho risolto così :

Codice:
(Puntatoreclasse->* (Puntatoreclasse->array_punt_func[0]))(ingresso);
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Bentornati nel 2007: le memorie DDR3 rin...
Stellantis aderisce ad AI4I e Fondazione...
Google Pixel 10a: prime conferme sul pre...
ISRO potrebbe lanciare la capsula Gagany...
Un nuovo leak conferma dimensioni e novi...
Steam Machine: requisiti Verified piu' s...
NVIDIA GeForce RTX 5070 Ti fuori produzi...
Sony ha annunciato i nuovi giochi che en...
IBM Sovereign Core: la sovranità ...
Cerchi un'asciugatrice conveniente su Am...
Ayaneo Pocket Play arriverà in ri...
iPad Pro 11'' con chip M4 scende a 949€ ...
The Sims entra in una nuova era, ma l'ac...
Netflix, Disney o Prime Video: qual &egr...
Perplexity blocca la generazione di imma...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v