Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
TheDarkJuster, ho fatto in modo che le funzioni CondizioneNullitaXxxx() ricevessero puntatori e non valori-copia perché ho pensato a situazioni nelle quali magari la funzione template CompattaArray() viene istanziata per trattare classi complesse con un nutrito impiego di memoria dinamica. Così facendo, nelle mie intenzioni, volevo evitare d'attivare il costruttore di copia e saltare così un sacco di passaggi potenzialmente inutili. E' ben vero che poi vanifico il tutto con quella serie infinita di operatori di assegnamento in CompattaArray(), ma la mia tecnica è limitata e più in là di così non sono riuscito ad andare. Non ancora, per lo meno. (la speranza è l'ultima a morire)
Ultima modifica effettuata da AldoBaldo il 07/11/2015 alle 15:13
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Lumo, mi fai fare la figura del pirla, e me lo merito. A una funzione che accetta un puntatore a puntatore passo l'indirizzo a un puntatore "semplice" e manco me ne accorgo pur guardando, e riguardando, e riguardando ancora. Robe da chiodi. Prosciutto sugli occhi. Che vergogna! Be', me la cavo come al solito: facendo notare la firma in calce a ciascuno dei miei messaggi.
Ora funziona tutto a dovere.
Grazie davvero per la guida che mi offrite (tu e gli altri) nell'orientarmi in questo mio hobby.
P.S. Ero disperato, perché ormai avevo già finito la terza bottiglia di rosso... purtuttavia continuavo a non ricavarne nessuna illuminazione.
PP.SS. Non è vero, non mi sono pippato così tanto rosso... però dirlo fa tanto "colore"!
Un puntatore sfugge a tutti, attenzione però, l'errore principale era la constness negli argomenti che passavi. Avevi messo un const di troppo (se guardi riga per riga trovi la modifica).
Vedo, hai trasformato const char * in char**. Capisco il perché della doppia indirezione, però non capisco come mai "const" è di troppo, visto che il compilatore non mi segnala errore per la sua presenza.
Mi puoi brevemente dove sta l'inghippo, così aggiungo al mio armamentario anche quella nozione?
EDIT: successivamente ho provato a togliere il "const", e il compilatore ha sputato fuori questa sfilza di eccezioni...
||=== Build: Release in Prova fTemplate (compiler: GNU GCC Compiler) ===|
[...]\main.cpp||In function 'int main()':|
[...]\main.cpp|35|error: no matching function for call to 'CompattaArray(const char* [6], const unsigned int&, bool (&)(char**), const char**)'|
[...]\main.cpp|35|note: candidate is:|
[...]\main.cpp|5|note: template<class tipo> unsigned int CompattaArray(tipo*, unsigned int, bool (*)(tipo*), const tipo*)|
[...]\main.cpp|5|note: template argument deduction/substitution failed:|
[...]\main.cpp|35|note: deduced conflicting types for parameter 'tipo' ('const char*' and 'char*')|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
Dunque parrebbe che "const" sia necessario. Che casino! Forse perché sto effettivamente passando puntatori ricavati da un array di costanti stringa e non da un array di stringhe collocate in vettori di char...
Ultima modifica effettuata da AldoBaldo il 08/11/2015 alle 8:09
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Sembra che tu cerchi di invocare una funzione con primo paramento un puntatore a costante char, perché usi const? c'è un motivo preciso? E quello che cercavo di capire dal primo post. Credo che l'errore stia nel fatto che const non è di per se un tipo e tu stai richiedendo al templeate di consideralo tale.
Vedo, hai trasformato const char * in char**. Capisco il perché della doppia indirezione, però non capisco come mai "const" è di troppo, visto che il compilatore non mi segnala errore per la sua presenza.
Mi puoi brevemente dove sta l'inghippo, così aggiungo al mio armamentario anche quella nozione?
EDIT: successivamente ho provato a togliere il "const", e il compilatore ha sputato fuori questa sfilza di eccezioni...
||=== Build: Release in Prova fTemplate (compiler: GNU GCC Compiler) ===|
[...]\main.cpp||In function 'int main()':|
[...]\main.cpp|35|error: no matching function for call to 'CompattaArray(const char* [6], const unsigned int&, bool (&)(char**), const char**)'|
[...]\main.cpp|35|note: candidate is:|
[...]\main.cpp|5|note: template<class tipo> unsigned int CompattaArray(tipo*, unsigned int, bool (*)(tipo*), const tipo*)|
[...]\main.cpp|5|note: template argument deduction/substitution failed:|
[...]\main.cpp|35|note: deduced conflicting types for parameter 'tipo' ('const char*' and 'char*')|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
Dunque parrebbe che "const" sia necessario. Che casino! Forse perché sto effettivamente passando puntatori ricavati da un array di costanti stringa e non da un array di stringhe collocate in vettori di char...
In effetti mi sto incasinando pure io, comunque questa dovrebbe essere la versione pedante con tutti i const:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <string.h>
template<class tipo>// prototipo della funzione template