Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-10-2007, 08:26   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
[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, 08:32   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 08:39   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 08:58   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 08: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, 08:59   #6
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 09:04   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 09:07   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 09: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, 09:38   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10:17   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 10:25   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2007, 10: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, 10:30   #14
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 10:32   #15
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 10: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, 10: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, 10:36   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
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, 10: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, 11:10   #20
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7358
Ho risolto così :

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


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Portatili in offerta su Amazon: MacBook ...
DeepSeek V4.1-Flash sostituisce il model...
Sciopero negli Apple Store italiani nel ...
vivo V70 5G a 461,70€: smartphone con fo...
Metal Slug Ultimate Collection annunciat...
Basta file di testo in chiaro: Android s...
Dalla CO2 al metano usando l'elettricità...
iOS 27 arriva il 14 settembre: ecco qual...
Ray-Ban Meta dentro il carcere: il video...
NVIDIA cambia la RTX 5070? Chip pi&ugrav...
Qwen3.8-27B gira su un portatile da 12GB...
Gemini lascia il browser e diventa un'ap...
EA e Savvy Games verso un unico colosso ...
Attenzione al falso SMS di BRT: dopo la ...
ASUS ROG Raikiri II Pro PC: controller d...
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: 10:43.


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