PDA

View Full Version : [C++/Visual C++] Consigli e trucchi


_Claudio
12-04-2009, 21:48
Dopo 3 anni sono tornato (finalmente??) a lavorare con C++ su Windows.

Vorrei sapere come lavorate, cosa consultate, trucchi e consigli utili che potrebbero facilitare il lavoro a me e ad altri interessati.

Sarebbe bello anche condividere le vostre esperienze sulle varie piattaforme: .net, vcl, atl, stl, mfc, win32 nativo, fltk, wxWidgets, qt, opengl, directx, ecc...

Su quali di queste vi siete trovati meglio e cosa consigliate ai posteri.

Raccogliendo qui considerazioni e opinioni possiamo creare un punto di riferimento per chi si avvicina allo sviluppo visuale (e, non lo nascondo, un buon ripasso anche per me) e si trova di fronte decine di manuali/guide/ambienti dalla sintassi ostica e estremamente prolissi (difetto insito nella natura del C++).

Personalmente poi cerco qualcuno che ha lavorato con librerie crittografiche e curve ellittiche.

71104
13-04-2009, 11:22
quando uso il C++ attualmente uso ATL, WTL e API Win32; questo perché se sto usando C++ significa che devo lavorare a basso livello, cioé a contatto col sistema operativo, e non vale la pena di stare ad importare decine di API in .NET. in tutti gli altri casi uso .NET, oppure Java se il programma deve (disgraziatamente) funzionare anche su Linux.

come documentazione per ATL e Win32 vado sulla libreria MSDN; per WTL invece la documentazione sta qua:
http://www.viksoe.dk/code/wtldoc.htm

_Claudio
13-04-2009, 19:26
Io sto iniziando con visual c++ su .net e per la programmazione nativa penso di usare le wxWidget che sono ben documentate, con 30 paginette scarse si è già operativi e coprono una buona superficie di sviluppo grafico.

Le MFC a mio avviso sono oramai obsolete, troppo contorte e tenute in vita a fatica, correggetemi se sbaglio. Non le sopportavo 3-4 anni fa per la loro verbosità, tantomeno le sopporto ora.

tomminno
13-04-2009, 20:29
Io sto iniziando con visual c++ su .net e per la programmazione nativa penso di usare le wxWidget che sono ben documentate, con 30 paginette scarse si è già operativi e coprono una buona superficie di sviluppo grafico.

Le MFC a mio avviso sono oramai obsolete, troppo contorte e tenute in vita a fatica, correggetemi se sbaglio. Non le sopportavo 3-4 anni fa per la loro verbosità, tantomeno le sopporto ora.

Le QT sono indubbiamente le migliori, hanno l'inconveniente di non avere il look & feel nativo, le wxWidgets sono parecchio old style quanto a programmazione, ma hanno il look&feel nativo, sono semplici da usare.
Le MFC sono decisamente insopportabili, adesso con il SP1 di VS2008 hanno guadagnato quell'incomprensibile interfaccia ribbon, che non sai mai dove sta quello che cerchi, per non parlare del fatto che per fare un'interfaccia che si espanda a dovere bisogna faticare non poco, niente sizer.

71104
13-04-2009, 21:09
hanno guadagnato quell'incomprensibile interfaccia ribbon, che non sai mai dove sta quello che cerchi, é precisamente l'opposto: il ribbon é fatto apposta per mostrarti tutto quello che il programma puó offrirti senza nasconderti nulla in remoti meandri di sottomenu di sottomenu di menu.

_Claudio
13-04-2009, 21:27
Vada per le wx, perchè comunque se sviluppo in nativo vuol dire che faccio cose a basso livello e del L&F poco me ne importa.

Poi sono proprio quello che cercavo: una semplice astrazione mediante inglobamenti in classi C++ della programmazione Win32.

...e c'è scritto che sono pure multipiattaforma (compilazione permettendo)... niente porting impossibili quindi...

tomminno
13-04-2009, 21:51
é precisamente l'opposto: il ribbon é fatto apposta per mostrarti tutto quello che il programma puó offrirti senza nasconderti nulla in remoti meandri di sottomenu di sottomenu di menu.

Il problema è proprio questo, mostra tutto insieme non c'è un'organizzazione, se cerchi qualcosa devi guardare tutta la barra dei controlli e sperare di trovare alla prima quello che cerchi. E spesso ti tocca guardarle tutte, prima di accorgerti che non l'avevi visto quando ci eri passato sopra precedentemente.
Sempre che tu non stia cercando Stampa...

Poi quando impari il posizionamento dei comandi che più usi arriva puntualmente un plugin a spostare le carte in tavola, per cui quello che cerchi non è dove dovrebbe essere.

71104
13-04-2009, 21:58
Il problema è proprio questo, mostra tutto insieme non c'è un'organizzazione, se cerchi qualcosa devi guardare tutta la barra dei controlli e sperare di trovare alla prima quello che cerchi. E spesso ti tocca guardarle tutte, prima di accorgerti che non l'avevi visto quando ci eri passato sopra precedentemente. problema che esiste tale e quale coi menu: cerchi e ricerchi, ci passi anche sopra ma non trovi; alla fine qualcuno di fa vedere dove cavolo stava.
rassegnati, non sono ingenue le dozzine di persone che hanno lavorato a queste problematiche; non é che adesso arrivi tu e con un paio di sfoghi frustrati smonti in due secondi il lavoro ponderato di un team costituito da molte piu persone di te e (probabilmente, ma non so di cosa ti occupi tu) molto piu esperte nel settore.


Poi quando impari il posizionamento dei comandi che più usi arriva puntualmente un plugin a spostare le carte in tavola, per cui quello che cerchi non è dove dovrebbe essere. mai capitata una simile esperienza, anche perché per ora sono pochissimi i programmi che usano il ribbon, giusto Office e le nuove versioni degli accessori di Seven; se poi esistono programmi che permettono ai loro plugins di spostargli gli elementi dell'interfaccia son fatti loro...

_Claudio
13-04-2009, 22:01
problema che esiste tale e quale coi menu: cerchi e ricerchi, ci passi anche sopra ma non trovi; alla fine qualcuno di fa vedere dove cavolo stava.
rassegnati, non sono ingenue le dozzine di persone che hanno lavorato a queste problematiche; non é che adesso arrivi tu e con un paio di sfoghi frustrati smonti in due secondi il lavoro ponderato di un team costituito da molte piu persone di te e (probabilmente, ma non so di cosa ti occupi tu) molto piu esperte nel settore.


mai capitata una simile esperienza, anche perché per ora sono pochissimi i programmi che usano il ribbon, giusto Office e le nuove versioni degli accessori di Seven; se poi esistono programmi che permettono ai loro plugins di spostargli gli elementi dell'interfaccia son fatti loro...

I menù di Office 2007 è quanto di più bello la mente umana ha concepito sull'usabilità, finalmente han reso office utilizzabile ed è inutile dire che come programma di elaborazione testi è stupendamente perfetto...

Però personalmente non ho mai sviluppato nulla con Ribbon e non saprei dire se Office è così bello perchè hanno usato bene Ribbon o perchè è Ribbon stesso ad essere così evoluto.

71104
13-04-2009, 22:13
I menù di Office 2007 è quanto di più bello la mente umana ha concepito sull'usabilità, finalmente han reso office utilizzabile ed è inutile dire che come programma di elaborazione testi è stupendamente perfetto...

Però personalmente non ho mai sviluppato nulla con Ribbon e non saprei dire se Office è così bello perchè hanno usato bene Ribbon o perchè è Ribbon stesso ad essere così evoluto. giusto per curiositá... era un post ironico vero? :D

_Claudio
13-04-2009, 22:15
giusto per curiositá... era un post ironico vero? :D

No no, lo dico e lo confermo, e tra le tante cose mi sono pure occupato di problemi di usabilità quindi almeno un minimo so di cosa parlo.

tomminno
14-04-2009, 08:12
problema che esiste tale e quale coi menu: cerchi e ricerchi, ci passi anche sopra ma non trovi; alla fine qualcuno di fa vedere dove cavolo stava.


Sono anni che esistono le toolbar dove metti tutti i comandi che ti servono.
Se dovessi pensare a Visual Studio con interfaccia Ribbon mi prendono i brividi...


rassegnati, non sono ingenue le dozzine di persone che hanno lavorato a queste problematiche; non é che adesso arrivi tu e con un paio di sfoghi frustrati smonti in due secondi il lavoro ponderato di un team costituito da molte piu persone di te e (probabilmente, ma non so di cosa ti occupi tu) molto piu esperte nel settore.


Guarda che non è che solo perchè l'hanno fatto in tanti deve essere per forza ottimo.
Probabilmente l'hanno ottimizzato per l'utente (utonto?) medio di Office, ma sicuramente non per tutti.

Devi continuamente spostarti tra una toolbar e l'altra per usare le funzionalità, oppure ricordarti a memoria degli improbabilissimi shortcut che cambiano ad ogni versione di Office.

Poi occupa un sacco di spazio verticale, spazio che, grazie all'inutile moda dei 16:9, è molto risicato.

javaboy
14-04-2009, 09:34
Io ho lavorato spesso con Qt.
Complete, eleganti, estremamente ben documentate. Non posso non consigliartele.

_Claudio
14-04-2009, 10:20
Io ho lavorato spesso con Qt.
Complete, eleganti, estremamente ben documentate. Non posso non consigliartele.

QT... me lo devo ricordare...

Stà fermo lì che ti do io un promemoria...

Bottiglione di QT che gira... :D

71104
14-04-2009, 10:52
Guarda che non è che solo perchè l'hanno fatto in tanti deve essere per forza ottimo. no ma probabilmente é molto meglio di quello che avresti potuto fare tu in tempi maggiori.

71104
14-04-2009, 10:55
Poi occupa un sacco di spazio verticale, spazio che, grazie all'inutile moda dei 16:9, è molto risicato. 16:9 é solo una proporzione: uno schermo da 16:9 puó anche essere alto 9 metri e ospitare tre copie del nuovo Word lasciando spazio verticale sconfinato ai documenti.

_Claudio
14-04-2009, 11:09
Gli schermi 16:9 prima di essere una moda hanno un significato: hanno le stesse proporzioni della visuale umana.

Office con tutti quei comandi e quelle opzioni dubito sia migliorabile più di quanto non lo sia ora, io non so che documenti tu abbia fatto. Io ci ho scritto un paio di report tecnici e ho editato alcuni fogli excel e mi sono trovato benissimo pur usando funzionalità avanzate (creazione di sommario, indice, capitolazione ecc...).

tomminno
14-04-2009, 11:57
16:9 é solo una proporzione: uno schermo da 16:9 puó anche essere alto 9 metri e ospitare tre copie del nuovo Word lasciando spazio verticale sconfinato ai documenti.

Infatti te hai un monitor alto 9 metri.
Un 22" 16:9 ha una dimensione verticale che è 1cm meno di un 19" 4:3.
E' veramente fantastico ritrovarsi con lo schermo praticamente vuoto, in orizzontale, mentre in verticale è tutto uno scrollare.

tomminno
14-04-2009, 12:10
Gli schermi 16:9 prima di essere una moda hanno un significato: hanno le stesse proporzioni della visuale umana.


Peccato che è dimostrato che la mente si stanca di più se legge delle linee di testo molto lunghe, e davanti ad un monitor generalmente si legge del testo.
I 16:9 hanno un senso se si guardano film o al massimo si gioca, ma per tutto il resto no.
Oppure mi vuoi dire che trovi agevole la lettura di un testo con righe di 200 e più parole?


Office con tutti quei comandi e quelle opzioni dubito sia migliorabile più di quanto non lo sia ora, io non so che documenti tu abbia fatto. Io ci ho scritto un paio di report tecnici e ho editato alcuni fogli excel e mi sono trovato benissimo pur usando funzionalità avanzate (creazione di sommario, indice, capitolazione ecc...).

Premesso che mi trovo malissimo con gli editor automatici qualunque essi siano, per i soliti problemi dovuti agli automatismi che spesso non funzionano.
Creazione sommario: se non usi lo stile titolo col cavolo che funziona.
Ma se voglio uno stile differente?
L'allineamento del testo nell'indice è a completa discrezione di Word.
I margini che più delle volte ti ritrovi essere differenti tra una pagina e l'altra, solo perchè ad un certo punto Word ha deciso di spostarli per chissà quale motivo, e non riesci mai a riposizionare i segnaposto nelle posizioni desiderate, esteticamente un'oscenità.
Elenchi annidati dove sempre c'è da perdere tempo tutte le volte per farlgi capire di riprendere la numerazione corretta.
Lo stupido strumento pennello da usare a man bassa...

_Claudio
14-04-2009, 12:30
Peccato che è dimostrato che la mente si stanca di più se legge delle linee di testo molto lunghe, e davanti ad un monitor generalmente si legge del testo.
I 16:9 hanno un senso se si guardano film o al massimo si gioca, ma per tutto il resto no.
Oppure mi vuoi dire che trovi agevole la lettura di un testo con righe di 200 e più parole?


Leggere righe molto lunghe è scomodo è vero, ma se ci sono i 16:9 un perchè c'è e non è moda. Poi per cosa si usino è un'altra questione.


Premesso che mi trovo malissimo con gli editor automatici qualunque essi siano, per i soliti problemi dovuti agli automatismi che spesso non funzionano.
Creazione sommario: se non usi lo stile titolo col cavolo che funziona.
Ma se voglio uno stile differente?


Puoi definire uno stile che più preferisci e associarlo al sommario.


L'allineamento del testo nell'indice è a completa discrezione di Word.
I margini che più delle volte ti ritrovi essere differenti tra una pagina e l'altra, solo perchè ad un certo punto Word ha deciso di spostarli per chissà quale motivo, e non riesci mai a riposizionare i segnaposto nelle posizioni desiderate, esteticamente un'oscenità.
Elenchi annidati dove sempre c'è da perdere tempo tutte le volte per farlgi capire di riprendere la numerazione corretta.
Lo stupido strumento pennello da usare a man bassa...

Di solito la numerazione e la formattazione si fa a testo ultimato... questo in generale, sia con Word che con qualunque altra applicazione.
A meno che non usi Latex... di cui non commento l'oscenità.

_Claudio
14-04-2009, 19:47
Ho compilato le wx con alcuni problemi, comunque devo dire che tutto sommato è andata liscia, il progetto era della versione 6, è stato convertito prima dell'apertura.

Compilando in debug su VC++ 2008 mode però non trovava un file e continuava a compilare lo stesso progetto ciclicamente, per ora ho compilato in release mode.

Poi vorrei consigliare questo libro: http://www.amazon.ca/Cross-Platform-Programming-wxWidgets-Julian-Smart/dp/0131473816

A breve proverò a fare la mia prima applicazione con le wx giusto per rendermi conto di chi, come, cosa e perchè.

Inoltre vorrei consigliare gli appunti di Alex Martelli sulla programmazione win32, anche se poi effettivamente penso nessuno nel 2009 sviluppa applicazioni direttamente sulla piattaforma avere una chiara concezione pratica di cosa poi viene fatto da .net e dalle wx a basso livello non è male.
http://www.aleax.it/TutWin32/

C'è da dire che traspare chiaramente la bravura di Alex Martelli per il semplice fatto che il tutorial da lui realizzato è una raccolta densissima di codice e cose concrete, senza trattati simil-filosofici sulla dichiarazione di funzioni...

Qualcuno di voi inoltre ha letto il libro di C++ di Bjarne Stroustrup?

71104
14-04-2009, 23:45
Peccato che è dimostrato che la mente si stanca di più se legge delle linee di testo molto lunghe, e davanti ad un monitor generalmente si legge del testo.
I 16:9 hanno un senso se si guardano film o al massimo si gioca, ma per tutto il resto no.
Oppure mi vuoi dire che trovi agevole la lettura di un testo con righe di 200 e più parole? stai inventando un problema piu inesistente dell'altro, e non capisco neanche perché: Word, appena aperto, non ti fa scrivere 200 parole a riga; e in generale la risoluzione del monitor non influenza questo aspetto.

l'obiezione vale casomai per il web (che non é "tutto il resto" ma é una cosa molto piu specifica) ma se l'utente ha la finestra del browser massimizzata é perché l'ha voluta lui cosi, quindi si trova a suo agio in quel modo.

Albi89
15-04-2009, 00:15
Anche io sto avendo difficoltà a seguire la conversazione...
Office l'ho preso da poco approfittando della promozione per studenti universitari, principalmente perchè mi passano per le mani molti documenti in formato Office e mi era comodo aprirli senza conversioni strane... e sicuramente non tornerei a OpenOffice, anche per via dell'interfaccia Office Fluent che è quanto di più brillante abbia creato MS nell'ambito dell'interattività da, credo, sempre.
A parte che tutto sembra "al posto giusto", c'è anche da dire che evita di aprire menu che sicuramente prendono più spazio in verticale rispetto al ribbon.
Sul discorso 16:9 poi non so che dire... io mi ci trovo benissimo, ovviamente non usando le applicazioni a schermo intero ma riducendole a finestre quadrate di dimensioni utili per lo scopo... in questo modo ottimizzo lo spazio e, anche volendo, non riuscirei a scrivere righe di n caratteri per n molto elevato con word perchè sono costretto dalle dimensioni del foglio A4.
Sinceramente a volte mi chiedo anche come avevo fatto a programmare prima di avere un 22" in 16:9, ma immagino questi siano gusti decisamente personali.

Riavvolgendoci, ho usato poco le Qt ma le ho trovate molto divertenti - e tra l'altro la documentazione si butta, sul sito trolltech è ottima e c'è anche il link a un libro che permette di comprendere i meccanismi principali, in modo da poter consultare la documentazione più fluentemente -.
Non ho capito però il discorso sul look'n'feel nativo, sotto vista le applicazioni qt e quelle wxwidgets hanno esattamente lo stesso (ottimo) aspetto... ma qt mi è sembrato molto più skinnabile e personalizzabile (almeno da quello che ho visto giocando con gli esempi di codice che si installano con la libreria).
Aspetto delucidazioni :sofico:

Edit: aggiungo il librone http://www.qtrac.eu/C++-GUI-Programming-with-Qt-4-1st-ed.zip

Tommo
15-04-2009, 00:30
Beh IMHO l'interfaccia Ribbon è decisamente ottima... è vero che si fa fatica a capire dove dovrebbero stare le cose, ma in generale è decisamente migliore.
Tuttavia risulta un bel pò spaesante a chi era abituato con la vecchia...

Per quanto riguarda i 16:9 è vero che sono una grossissima fregatura che ci propina il mercato!
La risoluzione orizzontale è quella che conta maggiormente in ambito office/developing, proprio perchè le righe di un testo sono in orizzontale... infatti io sono dovuto passare da un 17'' 4/3 ad un 19'' 16/9 proprio per non perderci troppo... perdo 124 pixels, che nel codice sono quasi 5 righe.

Cmq come strumenti per il C++ a se consiglio solo Visual Assist X, che è davvero una roba speciale... al confronto sembra di programmare usando il blocco note :asd:

_Claudio
15-04-2009, 22:48
Ho guardato QT e WX... e preferisco le WX... per il semplice motivo che mi sembrano più... rozze. Pochi formalismi e tanta concretezza. Per ora mi concentro su queste.

Comunque molto belle anche le qt, qualcuno conosce nei dettagli l'implementazione? Compilate generano bytecode nativo?

Visual Assist X a quanto ho capito è a pagamento o trial... ci ho visto giusto?

Oggi non ho potuto lavorarci molto, a breve nuovi aggiornamenti.

Raiki
16-04-2009, 07:43
Visual Assist X a quanto ho capito è a pagamento o trial... ci ho visto giusto?


Si,e il trial dura 30 giorni

javaboy
16-04-2009, 07:49
Ho guardato QT e WX... e preferisco le WX... per il semplice motivo che mi sembrano più... rozze. Pochi formalismi e tanta concretezza. Per ora mi concentro su queste.

Comunque molto belle anche le qt, qualcuno conosce nei dettagli l'implementazione? Compilate generano bytecode nativo?

Visual Assist X a quanto ho capito è a pagamento o trial... ci ho visto giusto?

Oggi non ho potuto lavorarci molto, a breve nuovi aggiornamenti.

Il codice è nativo ma utilizza delle macro particolari che vengono trasformate in codice c++
tradizionale dal meta object compiler. (Spiegazione fatta con i piedi...)

http://doc.trolltech.com/4.5/metaobjects.html

-Slash
16-04-2009, 09:30
Le QT sono indubbiamente le migliori, hanno l'inconveniente di non avere il look & feel nativo, le wxWidgets sono parecchio old style quanto a programmazione, ma hanno il look&feel nativo, sono semplici da usare.
Le MFC sono decisamente insopportabili, adesso con il SP1 di VS2008 hanno guadagnato quell'incomprensibile interfaccia ribbon, che non sai mai dove sta quello che cerchi, per non parlare del fatto che per fare un'interfaccia che si espanda a dovere bisogna faticare non poco, niente sizer.
Dalla versione 4.4 le qt hanno look and feel nativo sia su windows che su macosx. Ed anche su linux su gnome a patto di aver installato il wrapper gtk-qt

Albitexm
19-04-2009, 00:44
Io ho installato VC++ 2008 express con msdn e ci ho messo più o meno lo stesso tempo.
Non ho inoltre alcun processo che lavora in background.

Posso chiederti se sai già sviluppare con VC++ e per cosa lo userai?
Io sto (re)iniziando ora e vorrei raccogliere più esperienze possibili su come lavorarci e trucchetti vari dello sviluppo anche a basso livello con C++.

Ho intenzione di usare il C++ per scrivere dei tools di analisi scacchistici.
Oltre a Visual C++ uso anche CodeBlock, consigliatomi qua sul forum e Scilab (clone di Matlab).

_Claudio
19-04-2009, 09:27
Ho intenzione di usare il C++ per scrivere dei tools di analisi scacchistici.
Oltre a Visual C++ uso anche CodeBlock, consigliatomi qua sul forum e Scilab (clone di Matlab).

Io uso Visual C++ per tutto, CodeBlock l'ho provato, carino ma alla fine non integrava molto bene tutto. Poi preferisco avere un solo ambiente.

Il compilatore microsoft poi funziona a meraviglia (anche se a volte è troppo precisino).

_Claudio
19-04-2009, 11:25
Sapete qualcosa sui cast?

Quello che so io è:
static_cast<tipo>(espr) fa un cast statico (non a runtime) dal tipo ritornato da espr a quello specificato in tipo.
dynamic_cast<tipo>(espr) fa un cast a runtime sul tipo dinamico di espr.
reinterpret_cast<tipo>(espr) fa un cast tra i tipi dei puntatori.
const_cast<tipo>(espr) agisce sui modificatori, const, ecc...
Questi operatori di cast seguono le regole base del C++ circa la conversione tra tipi.

Quali sono gli operatori di cast managed del CLR?
Quale è meglio usare tra i due?

Io uso per il codice a basso livello, ad esempio quello che modellizza le curve ellittiche e sta su un thread che fa i calcoli dietro al form, i cast nativi, mentre sui form cosa è meglio usare per castare tipi gestiti?

Conoscete una funzione di arrotondamento (valida anche per numeri negativi) facente parte delle librerie stl o della libreria C (cmath)?
Ho provato con round ma il compilatore msvc non me lo vede (ho incluso correttamente cmath).
Mi scoccia usare System::Math::Round nel codice che gira dietro perchè ho la netta sensazione che sia pesante passare dal CLR ogni volta che devo arrotondare.
Come avete capito l'applicazione che sto realizzando fa molti calcoli ed è quindi time-bounded, devo usare i thread che realizzerò se possibile nativamente attraverso una classe ponte tra CLR e win32 e poi vorrei confrontare le prestazioni di questi thread con quelli gestiti.

Albitexm
19-04-2009, 23:41
Io uso Visual C++ per tutto, CodeBlock l'ho provato, carino ma alla fine non integrava molto bene tutto. Poi preferisco avere un solo ambiente.

Il compilatore microsoft poi funziona a meraviglia (anche se a volte è troppo precisino).

E' interessante a scopo didattico, SmallBasic, sempre della Microsoft.Trovo molto utile per gli esordienti il tutorial in PDF allegato. Peccato che sia in inglese, ma non è difficile tradurlo. E' neccessario avere il net framework 3.5 per farlo girare. E' appena di 5Mb. Ma evviva la semplicità :D

_Claudio
20-04-2009, 00:48
E' interessante a scopo didattico, SmallBasic, sempre della Microsoft.Trovo molto utile per gli esordienti il tutorial in PDF allegato. Peccato che sia in inglese, ma non è difficile tradurlo. E' neccessario avere il net framework 3.5 per farlo girare. E' appena di 5Mb. Ma evviva la semplicità :D

Carinissimo per iniziare a programmare, ma dubito si abbia sufficiente supporto nella creazione di interfacce grafiche e all'interno di progetti complessi.
Domani comunque lo proverò, per stasera direi basta, sono riuscito a fare overload e creare una classe che modellizza i numeri in modulo...

Peccato non sia pubblicizzato come merita quel programmino.

Grazie 1000 Albi.

Albitexm
20-04-2009, 21:53
Carinissimo per iniziare a programmare, ma dubito si abbia sufficiente supporto nella creazione di interfacce grafiche e all'interno di progetti complessi.
Domani comunque lo proverò, per stasera direi basta, sono riuscito a fare overload e creare una classe che modellizza i numeri in modulo...

Peccato non sia pubblicizzato come merita quel programmino.

Grazie 1000 Albi.

Un manuale che trovo ben fatto: "Manuale di C++" di Cesare Rota , HOELPI informatica. Pagine a colori , non le solite pagine dattiloscritte in bn su carta di baso livello. Molto pratico.
nota: sempre per principianti.

_Claudio
20-04-2009, 22:17
Un manuale che trovo ben fatto: "Manuale di C++" di Cesare Rota , HOELPI informatica. Pagine a colori , non le solite pagine dattiloscritte in bn su carta di baso livello. Molto pratico.
nota: sempre per principianti.

Da quel punto di vista ho già lo Stroustrup... quindi meglio di così... anche se in quanto a completezza è il migliore, così come è forse il peggiore in termini di verbosità e trattazione oltremodo teorica.

_Claudio
06-05-2009, 17:21
Ho un piccolo problema coi membri statici:
se ho:

void main(void) {
A a = a();

cout << A::valorex(); /* visualizza 1 */

A::impostax(2);

cout << A::valorex(); /* visualizza ancora 1 e non 2, perchè? */
}

class A {
private:
static int x;
public:
static void impostax(int);
static int valorex() { return A::x; }
};

int A::x = 1;

void A::impostax(int xx) { A::x = xx; }


Come mai rimane il valore impostato staticamente all'avvio e non viene modificato?
Pare sia un problema relativo alla funzione che ritorna il valore di x che è statica... non riesco però a capire il perchè...
Ho bisogno di fare accesso alla variabile statica perchè ho un intreccio di classi per un programma di modellizzazione...
È un errore concettuale fare accesso ad un membro statico con una funzione statica?

BrutPitt
06-05-2009, 18:34
Ho un piccolo problema coi membri statici:
Pare sia un problema relativo alla funzione che ritorna il valore di x che è statica... non riesco però a capire il perchè...
Ho bisogno di fare accesso alla variabile statica perchè ho un intreccio di classi per un programma di modellizzazione...
È un errore concettuale fare accesso ad un membro statico con una funzione statica?

Immagino che il problema possa essere proprio la funzione valorex() ... che non potrebbe avere il modificatore const o volatile, in quanto static.

Ma il compilatore non ti dice nulla?
Che compilatore stai usando?

In teoria dovrebbe segnalarti che non puoi avere un cv-qualifier o che il modificatore non e' permesso.

_Claudio
06-05-2009, 19:00
Immagino che il problema possa essere proprio la funzione valorex() ... che non potrebbe avere il modificatore const o volatile, in quanto static.

Ma il compilatore non ti dice nulla?
Che compilatore stai usando?

In teoria dovrebbe segnalarti che non puoi avere un cv-qualifier o che il modificatore non e' permesso.

Hai ragione anche te, grazie, quello è un esempio che non ho compilato, anche eliminando il modificatore const (che è sbagliato) il problema rimane il medesimo.

Quell'esempio l'ho scritto riportanto un'altra situazione che ho nel codice, purtroppo non posso postare tutto il codice perchè è veramente lungo e complesso.

Comunque il problema è quello che ho scritto, viene visualizzato il valore impostato staticamente e non quello statico modificato e runtime.

P.S. ho modificato e corretto il codice riportato prima.

_Claudio
06-05-2009, 19:06
Invece no, mi viene visualizzato correttamente 1 e poi 2 con questo esempio... non mi rimane che postare stralci del codice che presenta problemi...

Che situazione assurda... :muro:

BrutPitt
06-05-2009, 19:14
A-ehmmm... altro non vedo, a parte la dichiarazione...
A a = a();
... ma li' ho pensato ad un semplice errore di trascrizione.

Comunque m'hai incuriosito :D ... cosi' l'ho appena compilato e provato... con qualche piccola modifica, ma sostanzialmente il codice e' quello.

E funziona... come ci aspetteremmo :) ... sia compilato compilato col gcc v.4.3.x in Linux, che col cl v.15.00.30729 (VC++ 2008 SP1, per intenderci) in Windows.

Ti riporto di seguito il codice che ho compilato:


#include <iostream>

using namespace std;

class A {
private:
static int x;
public:
static void impostax(int);
static int valorex() { return A::x; }
};

int A::x = 1;

void A::impostax(int xx) { A::x = xx; }

int main() {
A a=A();

cout << A::valorex() << endl; /* visualizza 1 */

A::impostax(2);

cout << A::valorex() << endl; /* visualizza ancora 1 e non 2, perchè? */

return 0;
}



Pero', se risolvi, poi ci sveli il mistero... ;)

BrutPitt
06-05-2009, 19:15
ooopppsss... arrivato tardi :D

_Claudio
06-05-2009, 20:24
Ecco spezzoni del codice coinvolto, spero sia di vostra comprensione e gradimento.


/* nel form ho: */
private: System::Void bCalcola_Click(System::Object^ sender, System::EventArgs^ e) {
/* (1) */ equazione eq = equazione (0, 3, 7);
/* (2) */ curva c = curva (eq, true);
}

/* l'istruzione (1) invoca: */
/* il file equazione.h ha come dichiarazione di costruttore: */
equazione(int =0, int =0, int =2);
/* mentre nel file equazione.cpp è così definito: */
equazione::equazione(int aa, int bb, int mod) {
intmodulare::impostamodulo(mod);
a = aa;
b = bb;
}
/* intmodulare.h contiene */
private:
static int modulo;
public:
static void impostamodulo(int);
static int valoremod();
/* intmodulare.cpp contiene: */
int intmodulare::modulo = 2;
void intmodulare::impostamodulo(int mod) { intmodulare::modulo = mod; }
int intmodulare::valoremod() { return intmodulare::modulo; }

/* si passa all'esecuzione dell'istruzione (2) */
/* curva.h contiene la dichiarazione del costruttore */
curva(equazione, bool =false);

/* in curva.cpp c'è la sua definizione: */
curva::curva(equazione ee, bool calcola) : punti() {
e = ee;
if(calcola == true) curva::calcolapunti();
}
/* e la funzione che viene invocata dal costruttore */
void curva::calcolapunti() {
for(intmodulare x = 0; x < intmodulare::valoremod(); x++)
try {
intmodulare y = e.calcolay(x);
punti.push_back(punto(x, y));
} catch(equazione::nienteradice) { }
}

/* il problema è che intmodulare::valoremod() restituisce valore 2 e non valore 7 come specificato
nella chiamata al costruttore di equazone */

_Claudio
08-05-2009, 16:40
up

BrutPitt
08-05-2009, 16:57
Sai che forse...

equazione eq = equazione (0, 3, 7);

Prima viene chiamato (a destra) il costruttore:
equazione (0, 3, 7).

Poi c'e' la creazione di eq, con il costruttore di default.
equazione (0, 0, 2)

Ed infine l'assegnazione membro a membro degli elementi della classe equazione... ma non di quelli static, per cui "modulo" rimane impostato a 2.

_Claudio
08-05-2009, 17:40
Risolto...

È stata colpa di un'accozzaglia di errori subdoli dovuti all'impostazione di membri statici più volte all'interno di varie classi, è bastato ripensare al fatto che nella teoria il modulo viene impostato una sola volta dall'equazione...

Poi c'era anche un errore del tipo che dicevi te, ma leggermente diverso, nel senso che quando viene creato un oggetto curva, nel suo costruttore viene definito un parametro equazione che per diventare attuale chiama il costruttore con i valori di default.

Come regola generale è stato necessario creare un metodo statico all'interno della classe equazione e impostare "esternamente" al costruttore il valore del modulo.

Potremmo annoverare tra le regole generali di scrittura di buon codice OO che

Metodi statici che operano su membri statici NON vanno mai richiamati più volte dai costruttori della stessa classe o di altre classi, soprattutto quando si hanno valori di default per i parametri (C++) o overload dei costruttori (Java), è meglio usare metodi statici per tenerne chiaramente traccia nel codice.

Nessuno lo dice ma evita di perdere giorni e "inspaghettarsi" nel codice e in debug improbabili.

tomminno
09-05-2009, 00:04
Scusa ma che senso ha passare nel costruttore di equazione il valore di quacosa che non fa parte della classe equazione?
Se il modulo ha validità globale non ha senso che faccia parte dei parametri del costruttore, se non lo è allora equazione dovrebbe avere una propria variabile private per il valore del modulo.

E poi perchè accanirsi nel voler configurare nella classe equazione qualcosa che non ne fa parte?

Secondo me ti sei inspaghettato da solo nel codice che hai scritto. :)

_Claudio
09-05-2009, 00:36
Scusa ma che senso ha passare nel costruttore di equazione il valore di quacosa che non fa parte della classe equazione?
Se il modulo ha validità globale non ha senso che faccia parte dei parametri del costruttore, se non lo è allora equazione dovrebbe avere una propria variabile private per il valore del modulo.

E poi perchè accanirsi nel voler configurare nella classe equazione qualcosa che non ne fa parte?

Secondo me ti sei inspaghettato da solo nel codice che hai scritto. :)

Perchè non posso esporre la classe che modellizza gli interi modulari, il modulo deve rimanere all'interno dell'equazione e definire gli interi, è poi interessato al calcolo dei punti della curva e come detto sopra in scomposizioni che ne cambiano il valore.
Pertanto la classe equazione lo definisce per gli interi modulari e la classe che fa calcoli e scomposizioni fa i suoi giri per evitare di modificare il valore del modulo che di norma deve rimanere lo stesso...

Lo so, sembra tutto un casino... e difatti lo è quando si lavora con le curve ellittiche su un campo finito (quando va bene).