Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Codificatore - Versione 1.2

Codificatore

Sommario | Admin | Forum | Bugs | Todo | Files

Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:15
Domenica, 08/02/2015
Contrariamente a quel che pensavo di fare, ho preferito anticipare il completamento delle modifiche che avevo pianificato. In aggiunta a quelle che avevo già anticipato ne thread precedente, ho inserito un metodo di estrazione random() personalizzato che permette d'estrarre valori nell'intervallo 0-4294967295 anziché 0-32767 (utile per usare chiavi di dimensioni particolarmente grandi).

Vorrei ringraziare ancora una volta tutti coloro* che mi stanno aiutando a scoprire linee d'indirizzo alle quali probabilmente non avrei mai pensato autonomamente. Se ogni tanto reagisco con un po' di fastidio è solo perché non è mai piacevole sentir mettere in evidenza i propri difetti. Ripensarci a mente fredda, però, apre la strada a linee di ragionamento utili.

Il prossimo passo, se non riceverò ulteriori consigli, sarà qualche ritocco "cosmetico" al codice (ad esempio la modifica dei nomi di variabili e funzioni secondo le linee standard che già mi son state indicate) e la stesura di un piccolo manualetto per l'uso del programma.

*in particolare TheDarkJuster, Marco e Lumo, per la loro infinita pazienza.


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:07
Lunedì, 09/02/2015
Di niente, è un piacere aiutarti. Comunque vorrei farti notare delle cose:
1) const char *puntatore_chiave( void ) { return chiave; } ritorni l'indirizzo di memoria di una variabile privata di un oggetto. Se la variabile è privata significa che non vuoi poterne modificare il valore al di fuori della classe stessa, ma se tu ritorni il puntatore a quei dati è come rendere pubblico l'oggetto, ma costringersi a sprecare 2 cicli di clock (beh non so se nelle CPU x86 i cicli di clock per una call sono 2, ma nei PIC si) per fare una chiamata a una funzione del tutto superflua e sprecando inoltre memoria programma (e ti ho visto particolarmente attento alla memoria programma, per poi cadere in queste cose, è un vero peccato).
Alcune funzioni come elabora() avrebbero bisogno di essere documentate, o per lo meno di una-due righe affiancate al prototipo, giusto per dare l'idea immediata di cosa facciano.
Io solitamente piazzo un commento a fianco o sopra ad ogni metodo che scrivo e mi trovo benissimo, e se mi trovo bene io immagino che chi legge il mio codice si troverà ancora meglio.

PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:30
Lunedì, 09/02/2015
A proposito del puntatore restituito, non è che restituendolo come const ne rendi impossibile la modifica del contenuto? Se non erro (ed erro spesso) un programmatore incauto potrebbe liberare la memoria puntata, ma non scriverci su... L'alternativa, fin dove riesco a immaginare, sarebbe creare un'ulteriore copia in memoria dinamica di quella proprietà privata e restituire il puntatore a quella, con l'aggravante che chi riceve quel puntatore dovrebbe ricordarsi di liberare la memoria dinamica puntata e che ogni processo di allocazione potenzialmente genera errori dovuti all'esaurimento della memoria. Tra i due mali credo che, se adeguatamente documentata, la mia scelta non sia poi così tremenda. Sono comunque sempre disponibile a rivedere le mie opinioni.
Ma forse ti riferivi al fatto che puntatore_chiave() non viene mai usata nel programma? Perché è del tutto equivalente a puntatore_dati().

La documentazione è il prossimo passaggio che intendevo affrontare. In effetti vorrei scrivere due documentazioni: una orientata all'eventuale (molto eventuale) utilizzatore del programma, l'altra orientata all'eventuale (anche questo molto eventuale) sviluppatore che volesse modificarlo, ampliarlo, scopiazzarlo. Dunque, sì, ci sarà una documentazione circostanziata. Pensi sia "fuori standard" fare quel che ho in mente, ovvero allegare al tutto un pdf con le informazioni del caso anziché inserire commenti nel codice?


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:35
Martedì, 10/02/2015
Un puntatore è un puntatore, è un tipo di dato in un certo senso, e un casting da const char* a char è legale come un cast da bool* a double*, visto che l'indirizzo di memoria NON cambia in base a come tratti i dati memorizzati. La problematica di passare l'indirizzo o l'indirizzo di una copia va risolta tenendo in cosiderazione diverse cose, come ad esempio: sono pronto all'eventualità che qualcuno faccia un delete o cambi i dati? Quanto sono grandi i dati? Mi serviranno DOPO che ho eliminato l'oggetto?

Comunque io ho sempre apprezzato un piccolo (1-2MB) PDF nei sorgenti/librerie che ho dovuto usare, non so se sia fuori tempo o meno, ma mi è stato utile specialmente nel caso delle bullet physics library. Tuttavia un pdf NON può e NON DEVE sostituire i commenti nel codice. Un PDF deve dare una breve descrizione di come funziona la libreria, di come utilizzarla (senza scendere troppo in particolari), della sua licenza e di chi la ha scritta

Per capire meglio ti consiglio di stampare a video sizeof di diversi tipi di dati e sizeof di puntatori a variabili di diversi tipi di dati, stampare poi il valore dei dati e dei puntatori. Questo ti darà subito l'idea di quello che fai realmente quando ritorni un puntatore.

Ultima modifica effettuata da TheDarkJuster il 10/02/2015 alle 16:19
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:01
Martedì, 10/02/2015
Il pdf lo allegherò di sicuro appena avrò il tempo di stilarlo (la prossima settimana).

In merito ai puntatori, so cosa sono e come funzionano, così come so che la loro dimensione non dipende dal tipo di dato al quale puntano ma dal tipo di indirizzamento del sistema (per quel che ne so, in un sistema a16 bit i puntatori occupano 16 bit, in uno a 32 bit ne occupano 32, in uno a 64 bit ne occupano 64). So anche che con un cast puoi "sballare" completamente il meccanismo di "protezione" rappresentato da const, così come puoi "ingannare" il compilatore e fargli credere qualsiasi cosa (molto rischioso).

Ripensando alla tua osservazione, in effetti non si dovrebbe correre il rischio che i dati vengano cancellati o modificati, per cui appena avrò un po' di tempo* trasformerò la classe in modo che restituisca un puntatore a una copia dei dati stessi. Penserà poi la funzione che li ha richiesti a eliminarli nel modo più opportuno.

Come sempre, grazie per i consigli.

* in questo momento ho da "tenere a bada" (insieme ad altri sei colleghi) 104 piccoli diavoli undicenni, e sto scrivendo in uno dei pochi e minuscoli ritagli di tempo che riesco a ricavare nelle 24 ore. Il bello è che ieri, al momento della partenza, qualche genitore ha avuto il coraggio e la pochezza di augurarci "buona vacanza"! Chissà che film aveva visto.


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:26
Martedì, 10/02/2015
Bene a questo punto, visto che hai riflettuto sui puntatori hai di fronte due opzioni:
-perdere tempo CPU ad allocare la memoria per la copia e per copiare i dati
-rendere pubblico chiave

Se chiave è un intero romanzo o una raccolta di romanzi può essere una raccolta di byte molto grande, pensa bene se vale la pena "perdere" tempo a copiare la chiave (che tra l'altro dovrebbe rimanere segreta quindi privata all'interno di un oggetto).

Comunque buona fortuna con i 104 piccoli diavoli.

PM Quote