Newsgroup: it.comp.lang.c++
Titolo: Newbie & programmi.

Ciao a tutti,
dopo diverso tempo di lettura ho quasi finito di leggere i primo dei due 
volumi "C++ fondamenti di programmazione" dei fratelli Deitel
Secondo voi è meglio che legga anche il secondo volume e poi inizio a 
fare pratica o sperimenti da subito quello che ho imparato?
Ho provato a guardare sorgenti delle librerie e dei programmi per 
testare il mondo vero della programmazione ma sono stato "travolto" da 
comandi sconosciuti. Ho bisogno di lavorare su programmi facili per 
rafforzare le mie conoscenze qualcuno può darmi qualche dritta?
Ciao  e grazie
Lele

Butta via i libri C++ e programma in C. ;-)
(volevi una dritta giusto?)

 (volevi una dritta giusto?)
Si volevo una dritta, aggiungi qualche particolare per motivare le tue 
argomentazioni.
Perché a te il c++ non piace? Personalmente lo trovo molto potente anche 
se difficile.
Lele

Il C++ non mi piace, ma non e' questo il motivo del mio suggerimento.
Era una semplice battuta. Che pero' non e' riuscita molto bene...
Di codice in giro per internet ce ne e' una marea, letteralmente.
Purtroppo la maggior parte dei progetti fatti bene in C++ usano i
template in maniera estensiva.
Se vuoi iniziare con progetti piu' semplici, e' molto probabile che ti
imbatterai in codice scritto male, o comunque non realmente OO.
Oltretutto, guardare il codice di altri non e' come scriverlo da soli.
La differenza non e' solo di forma ma di sostanza: se tu non hai
esperienza puoi commettere due errori:
1) guardare il codice di altri e assumere che sia scritto bene, e nel
fare cio' imparare a programmare male
2) guardare il codice di altri, magari scritto anche bene, ma siccome
e' frustrante guardare il codice altrui, decidere invece di fare un
bel refactoring.
Il refactoring puo' funzionare, ma solo se giustificato.
Il mio suggerimento e' duplice:
1) prendi in mano un progetto altrui che non viene piu' manutenuto su
sourceforge.
2) inizia un nuovo progetto, semplice quanto vuoi, e pubblica il
codice online (su sourceforge per esempio).
In questa maniera hai la possibilita' di capire codice preesistente, e
anche di ricevere contributo da altri.

Ciao fnegroni,
il tuo consiglio è buono ma nel mio caso è decisamente inapplicabile,
come ti ho già detto sto cercando codice per capire come scrivere 
programmi e soprattutto imparare la sintassi.
Le idee per costruire sw ne ho a tonnellate ma mi manca completamente la 
tecnica.
E' impossibile che possa riprendere un progetto abbandonato e portarlo 
avanti dopo aver letto solamente un libro (di base).
Sono consapevole che sulla rete c'è una marea di codice, ma bisogna 
essere capaci di capirlo.
Ciao e Grazie
Lele

Secondo me, ti sbagli.
La differenza tra un buon programmatore (non necessariamente il
migliore) e un programmatore fallito e' solo una: il buon
programmatore porta a termine un progetto.
Se hai tonnellate di idee per scrivere programmi, porta una di queste
idee a completamento.
Altrimenti tutte le domande e risposte teoriche che hai imparato non
avranno mai una implementazione pratica a sostegno delle stesse.
E per esempio, manutenere un progetto in disuso non e' per nulla
difficile.
Prima di tutto in generale ci saranno dei bachi da schiacciare, quindi
le prime modifiche saranno poche.
Poi comunque parti da un progetto che ha una base di utenti il che
significa che hai gia' a disposizione dei testers e anche del
feedback.
In un certo senso e' proprio il motivo per cui non mi piace il C++.
Per imparare il C a sufficienza per scrivere programmi anche
relativamente complessi basta leggere 1 libro di poco piu' di 100
pagine.
Il resto e' tutto pratica, nessuna teoria.
E anche con una modesta conoscienza di C, puoi mettere mano a progetti
anche complessi senza timori: non ti viene nascosto nulla, e la
sintassi anche quella piu' complessa, bastano pochi minuti per
capirla.
Secondo me il C++ ti ha intimorito. E do la colpa al C++.
Non farti intimorire.
Prendi in mano un progetto in C e comincia a produrre codice.

P.S.
Perche' dici che ti manca la tecnica?
Se hai letto e applicato i concetti del libro, con gli esempi, hai
quanto di tecnica ci vuole per scrivere del codice.
Non riesco veramente a capire cosa ti manchi. Una volta che hai un
editor di testo e un compilatore, puoi fare quello che vuoi.
Nessuno ti obbliga a scrivere documentazione per programmare, nessuno
ti obbliga a scrivere una specifica prima di programmare.
Tu vuoi mettere in pratica la teoria, giusto?
Devi assolutamente iniziare un progetto.
Cominciamo: dimmi una delle idee che vuoi implementare.

Ciao fnegroni,
devo dire che sei davvero ottimista, 100 pagine e sufficiente io ne ho 
lette già 580 per 2 volte e mi sento tutt'altro che competete in più ne 
ho un altro da circa 509 pagine da leggere.
Cmq voglio fidarmi dal momento che ne sai più di me.
Ti elenco le funzioni del mio programma.
Ho una serie di lp convertiti a mp3, tutti riportano una devi marcatori 
per dividere il titolo dal nome ecc...
Esempio
Autore_-Canzone-Versione.mp3
Se vuoi ti posto il codice
Non ho ancora implementato la scritta/lettura sul hd perché non sono 
capace. Quindi per aggirare il problema ho inserito il dato da lavorare 
tramite una stringa
char canzone[] = "Autore_-Canzone-Versione.mp3"
vorrei trovare un comando che mi legga all'interno di canzone[] la 
denominazione ".mp3"
Ciao
Lele

 denominazione ".mp3"
Il comando che tu stai cercando e' una "chaiamata a funzione".
Puo' essere un metodo in una classe, o puo' essere una funzione alla
vecchia maniera, ovvero C.
Non importa, hai appena identificato un problema. Benissimo.
Solitamente la prima cosa che si fa, in qualunque linguaggio di
programmazione, e' verificare che quello che si vuol fare non sia gia'
stato implementato come funzione di libreria.
Come cercare la funzione dipende dal sistema operativo: su Windows si
usa l'MSDN opure l'help di Visual Studio. Su Unix si usa il comando
'man' seguito dal nome della funzione per avere una documentazione
dettagliata.
Nella libreria standard C, la funzione che cerca una sottostring
all'interno di una stringa si chiama strstr().
Per usarla in un programma C++, devi includere un header particolare,
chiamato <cstring>.
Online la documentazione si trova qui: 
http://www.cppreference.com/stdstring/strstr.html
Leggila e dimmi cosa ne intuisci: anche se errato, e' cosi' che
faresti anche da solo: prima ti leggi la documentazione e poi usi la
funzione.

 Cmq voglio fidarmi dal momento che ne sai più di me.
E presto tu ne saprai di piu' di me. Se programmi in C.
Se programmi in C++, ci vorra' piu' tempo solo per leggere i libri ;-)
100 pagine era per il libro sullo C, non sul C++.
Ho imparato C++ nel '93, sul libro originale di Strupstrup (non mi
ricordo mai come si spella il nome di quel tizio ;-) ) dove lui
scriveva: sarebbe bello se avessimo la ereditarieta' multipla...
A quel tempo il C++ veniva usato come una estensione del C, e non
aveva i template, le exceptions e altre cose sofisticate (i
namespaces...)
Oggi e' tutta un'altra roba (metaprogrammazione!)

Ciao fnegroni,
[CUT}
....strstr().
Mi servirebbe una funzione più specifica che legga SOLO gli ultimi 4 
caratteri nel mio caso ".mp3"
Esiste?
Dato che il mio inglese non è dei migliori c'è una qualcosa di italiano di
http://www.cppreference.com/stdstring/strstr.html
sarebbe un problema in meno.
Grazie
Lele

 Era una semplice battuta. Che pero' non e' riuscita molto bene...
Non e' riuscita perche' al giorno d'oggi suggerire il C al posto del C+
+ senza un'argomentazione solidissima alle spalle fa piuttosto
piangere che ridere.
Ciao,
Nicola

 programmatore porta a termine un progetto.
Mi sa che confondi la tenacia con la competenza.
Ciao,
Nicola


Tu vuoi leggere solo gli ultimi quattro caratteri giusto?
Puoi farlo, ma ricordati che in questo caso stai assumendo che gli
ultimi 4 caratteri della stringa sono sempre l'estensione del file.
Se puoi assumere cio', puoi benissimo estrarre gli ultimi 4 caratteri.
Siccome e' una stringa C quella che stai gestendo, ne conosci la
lunghezza?
Ci sono due modi per conoscere la lunghezza di una stringa: il primo
e' all'atto della compilazione, l'altro e' al runtime.
Sai dirmi cosa si usa al runtime?

 Sai dirmi cosa si usa al runtime?
No non lo so mi spiace.
Ciao e Grazie
Lele


Un programmatore competente ma che non finisce mai nulla e' fallito.
Un esperto di economia che e' in bancarotta e' un fallito.

 Un programmatore competente ma che non finisce mai nulla e' fallito.
O semplicemente disoccupato. :-)
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 


Suggerire qualunque linguaggio di programmazione ha comunque bisogno
di argomentazioni.
Ma esistono forti argomentazioni sia a favore del C che del C++ che di
Java, Python etc.
Ecco perche' era una battuta: suggerire il C++ al posto del C senza
forti argomentazioni fa ridere.
Ognuno comunque e' libero di scegliere.
In questo thread mi sto infatti concentrando ad aiutare Lele, e non
penso di essermi impegolato troppo in discussioni sul C++. Se l'ho
fatto, me ne scuso.

 No non lo so mi spiace.
La lunghezza di una stringa C, al runtime, si calcola usando strlen().
il risultato e' un numero intero di tipo size_t.
Sei su Unix (Linux, OS X) o su Windows?


Non e' una giustificazione: con tutti i programmi open source che ci
sono in giro, non c'e' piu' giustificazione a non realizzare i propri
sogni.

 Sei su Unix (Linux, OS X) o su Windows?
Lavoro su Linux (Mandriva 2008) e Xp
Ciao
Lele


 Lavoro su Linux (Mandriva 2008) e Xp
Allora devi ricordarti che affinche' il tuo codice sia portabile il
piu' possibile, dovrai a volte dover usare il preprocessore.
Per esempio nel mio progetto Kelp (che trovi su 
kelp.sf.net
), in
kelp.h definisco:
#ifdef _WIN32
	typedef __int64 off_t;
	#define ftello _ftelli64
	#define fseeko _fseeki64
#endif
in modo da rendere il mio codice portabile da Posix a Win32.

fare pratica o sperimenti da subito quello che ho imparato?
Credo che fare pratica *dopo* aver letto i libri sia sbagliato. Anche
al fine di memorizzare meglio i concetti è bene lavorare sugli esempi.
Un buon libro è un libro pieno di esempi. Aiutano molto gli esercizi
pratici che di norma sono presenti alla fine di ogni capitolo.
Bada che non parlo del libro in questione, che non conosco, ma (per
esempio) di "C++ Primer" 4^ edizione di Stanley Lippman. Un'altra
buona strada per imparare velocemente un linguaggio è frequentare
gruppi di discussione affollati, in cui vi sia molta gente che chiede
aiuto. Si ha a disposizione, in questo modo, una fonte virtualmente
inesauribile di piccole esigenze da risolvere di volta in volta. Io ho
consolidato la mia conoscenza del C in questo modo. Per il C++ è un
pochetto più difficile, mentre quasi sempre il C è usato a livello
didattico all'università, quindi, in periodo di appelli universitari,
il ng it.comp.lang.c si riempiva di scansafatiche che cercavano la
pappa pronta. Ed io approfittavo per risolvere i loro problemi ed
imparare. Il primo lavoro l'ho avuto grazie a questo know-how pubblico
che dimostravo.
Credo che tu debba prima consolidare la tua base di conoscenze C++ (e
questo puoi farlo solo per mezzo dei libri), frequentare qualche
gruppo e provare a risolvere i problemi degli altri. Poniti piccoli
obiettivi (non puntare troppo in alto) e cerca di raggiungerli. Devi
esercitarti moltissimo. 
Riguardo la polemica sterile che qualcuno ha scatenato tra C e C++,
non entro in merito perché la reputo, appunto, improduttiva. Se vuoi
imparare il C++, impara il C++ e lascia perdere il C.

 Adesso che sai la lunghezza della tua stringa (len).....
Io ho risolto cosi:
void rinominaNome2(char *divisorePtr){
   short shoI = 0; short shoTemp = 0;
   shoTemp = (strlen(divisorePtr) -4);
   do{
     shoI += 1;
     if (shoTemp == shoI)
       cout << "ok";
    } while (*divisorePtr != '\0');	
se sapessi lavorare direttamente a livello di indirizzo potrei evitare 
il contatore shoI.
Ciao e grazie
Lele

 Ma non ho ben capito come faccio a "prendere" gli ultimi 4 caratteri.
ma realmente hai letto per DUE volte un libro di C++ di 580 pagine ?
Che razza di testo non fa neppure un accenno di trattamento 
minimale di stringhe ? Oh, poi magari č un testo molto avanzato 
che parla di design invece di uno di base, per cui una scelta 
drammatica per un principiante.
Ma prima di rispondere, ti chiederei : sai cosa rappresenta un 
puntatore a carattere ? E l'operatore di "subscript" [] ?
Se si, siamo molto vicini, se no, la risposta non ti direbbe niente.
ciao
Soviet


Ciao Soviet_Mario,
perché la gente deve sempre rispondere per dimostrare la propria 
superiorità tecnica?
Se a tuo giudizio faccio domande troppo stupide puoi anche non leggerle.
Lele

 Lele

Ciao Soviet_Mario,
meglio cosi, ci siamo fraintesi..
Riguardo a strlen ho capito come funziona, il fatto di aver letto 580, 
non vuol dire che si sia capace di programmare, anzi se sono qui è per 
imparare. Sono un autodidatta quindi fidati che non è facile partire da 
zero.
In ogni caso se ti fa piacere insegnarmi qualcosa sono qui a tua 
disposizione.
Eccoti un po di codice:
void rinominaNome2(char *divisorePtr){
   short shoI = 0; short shoTemp = 0;
   shoTemp = (strlen(divisorePtr) -4);
   do{
     shoI += 1;
     if (shoTemp == shoI)
       cout << "ok";
    } while (*divisorePtr != '\0');
se sapessi lavorare direttamente a livello di indirizzo potrei evitare 
il contatore shoI.
Grazie
Lele

Riguardo a strlen ho capito come funziona,
Lele, segui i consigli e impara il C++. Usare strlen() significa
ricorrere, ancora, al C. Il mio è un consiglio vero, perché le
stringhe sono ciò con cui un principiante gioca per tutto il tempo e
il C può causarti forti mal di testa. Il C++ ha una classe std::string
che risolve per te la maggior parte dei problemi. Nel caso tu abbia
dei fini lavorativi, poi, il mio consiglio vale doppio.

 che risolve per te la maggior parte dei problemi. 
so che esiste nella classe string c'è .size (si chiama membro?) ma è 
adatto al tipo string e fa a pugni con char
Mi puoi fare un esempio?
Grazie
Lele

 Mi puoi fare un esempio?
Non vorrei essere petulante e demoralizzarti, ma forse č decisamente 
meglio se prima di cimentarti a scrivere il tuo programmino (che č si 
semplice) ti dessi una rilettura dei manuali di C++ e delle STL e facessi 
qualche esercizio. Come in tutte le cose non puoi davvero pretendere di 
risolvere un problema se non conosci gli strumenti che ti servono :)

adatto al tipo string e fa a pugni con char
Non capisco davvero che cosa tu intenda dire. 

 estrarre i 4 caratteri terminali di una stringa.
Tutt'altro: è proprio perchè si è letto in stecca due volte 580 pagine
che non lo sa fare.
Mi pare un principiante assoluto, e probabilmente il libro non era
pensato per questo tipo di utenza (oltre che fra tutti C++ è uno dei
linguaggi meno indicati).
Se uno parte, cazzeggia, si fa le funzioncine facili, smanetta gli
esempi, li sbaglia, etc etc etc etc, è anche possibile che poi riesca a
combinare qualcosa.
Cioè se io mi leggo in stecca due volte un manuale di scultura, non è
che alla fine mi posso aspettare di sapere scolpire qualcosa. Magari
prendendo il primo capitolo, facendo qualche prova etc etc etc, me ne
esco.
-- 
cc = callcc {|cc| cc.call cc}; cc.call cc

 imparare il C++, impara il C++ e lascia perdere il C.
Il che, aggiungo, passa per usare std::stringe e non passare per
tafaziane martellazioni con stringhe in stile C (char*, strlen) a meno
di non esserne completamente costretti.


Ciao camillo,
non sei petulante, letto ho letto e posso leggere 100.000 pagine
ma se non ci sbatto la testa, non imparo.
Lele

Ciao Andrea Laforgia,
 > Non capisco davvero che cosa tu intenda dire.
Scusami se mi sono espresso male, mi hai detto di non utilizzare 
strlen() perchè è c e non c++.
Quindi la mia domanda voleva essere qual'è un equivalente di strlen() in 
c++.
Lele

 due volte 580 pagine
che in realtà sono 734.
Per il resto quoto in toto.
Ho bisogno di mettere in pratica tutte le idee confuse che ho.
Grazie
Lele

di non esserne completamente costretti.
D'accordo++.

c++.
Perché non lo scopri da te?
T'assicuro che la mia non è cattiveria, è il consiglio più utile che
possa darti. Le tue incertezze riguardano parti fondamentali del
linguaggio, quindi ti è molto più d'aiuto della documentazione (libri,
link, ecc..) che un ng (dove, di norma, essendo fatti di carne, ci si
spazientisce facilmente se si fanno domande TROPPO banali). Nel
chiedere aiuto su dei concetti fondamentali come questi, ti stai
privando della parte più bella e avvincente della programmazione: la
ricerca delle informazioni per conto proprio. Hai un "std::string" ed
hai Google: io partirei da qui.

 hai Google: io partirei da qui.
ok  grazie
Lele

 risolvere un problema se non conosci gli strumenti che ti servono :)
Secondo me, invece, dipende dal tuo metodo di apprendimento. Io, ad 
esempio, non riesco a capire la teoria se prima non ho sbattuto la testa 
in pratica. Io ti consiglio di continuare con la pratica e perň 
contemporaneamente rileggerti la teoria e la documentazione delle 
librerie ogni volta che devi usare un nuovo costrutto.
E.

 Un esperto di economia che e' in bancarotta e' un fallito.
Oppure, più facilmente, viene eletto direttore di una banca ;-)
E.

 di non esserne completamente costretti.
Probabilmente avete ragione, ma le buone vecchie C-stringhe sono molto 
comode da usare, in certe situazioni. Tipicamente le operazioni piů 
semplici (se non ci sono da fare copie e inserimenti) si fanno 
direttamente senza dover ricorrere a funzione apposite delle librerie.
E.

 librerie ogni volta che devi usare un nuovo costrutto.
Quoto. Scegliersi piccoli problemi, studiare quello che ti serve per
risolverli, risolverli, passare oltre.
Una fonte quasi inesauribile di piccoli problemi di (facile)
implementazione sono gli algoritmi e le strutture dati. Verificare che
il codice sia corretto è relativamente facile (si sa in modo preciso
quale deve essere il comportamento di una data operazione), lo stato è
facile da controllare, gli errori 'esterni' sono quasi nulli.


 comode da usare, in certe situazioni.
Dipende cosa devi farci. Tipicamente per fare un programma che mainipola
stringhe, c-string + noob -> bug. :)


 il contatore shoI.
Sicuramente. Adesso rifacciamo la funzione insieme e vedrai come si
fa.

 
dunque, io non ho capito esattamente cosa vorrebbe fare questo 
codice (e non riconosco nemmeno più, per la denominazione delle 
variabili, la questione di individuare gli ultimi quattro 
caratteri di una strinca C like ... è decaduta la cosa ?).
Ad es. nel ciclo essenzialmente tu confronti la variabile ShoI, 
che viene incrementata di uno a ogni step, con la lunghezza 
della stringa. E se sono uguali stampi OK.
A cosa serve questo ?
Ah, poi considera cosa accade se la stringa è più corta di 4 
caratteri ... -> ShoTemp viene inizializzato a un numero negativo.
Andiamo avanti. La condizione del ciclo DO è una espressione 
costante. Perchè ? Semplice, perchè utilizza sempre lo stesso 
dato, ossia il puntatore originale all'inizio della stringa. Se 
quello è null esci alla prima iterazione, se non lo è (e non lo 
diventerà mai), il loop è infinito e non ne esci più.
E' possibile che tu volessi incrementare il puntatore a ogni 
step del ciclo (l'operatore ++ è valido per i puntatori, e serve 
appunto ad avanzare la "testina di lettura", la scansione della 
stringa).
Oppure potresti usare ShoI come INDICE (via subscript .... e ci 
avevo preso a dire che non hai chiaro l'uso di ptrSth [index]).
Quindi il tuo test di fine stringa forse voleva essere
 >    } while (divisorePtr [ShoI] != '\0');
ciò detto, un while è un ciclo di lunghezza indefinita più 
adatto a un contesto ignoto, ma se tu hai già definito le 
dimensioni con strlen, perché non fare un ciclo FOR con numero 
massimo di iterazioni prefissate ?
tipo
for (int J = shoTemp - 1; J >= 0; J --)
     { // procede a ritroso, se per caso ci sono molti DOT
     if (divisorePtr [J] == '.')
         {
         // TROVATO UN PUNTO (rightmost one)
         // ritorna un puntatore all'estensione del file
         return (char *)(divisorePtr + J + 1);
         };
     };
return 0; // non c'è estensione del file
considera che è un mero esercizio.
NON viene creata una nuova stringa né copiati i caratteri, ma la 
funzione ritorna solo un puntatore all'estensione (originale) 
ove presente nel parametro ricevuto in ingresso.
Come ti hanno detto, è una roba essenzialmente C-style e non ha 
molto a che vedere col C++.
Prova a capire quale costruttore della std::string sia più 
adatto a partire dal puntatore che ho ritornato, per creare una 
stringa di X caratteri (perchè tre ? Le estensioni oggi possono 
essere, mancanti e/o lunghe un numero qualsiasi di byte, così 
come pure estensioni multiple, l'ultima soltanto essendo 
significativa).
ciao
Soviet


Ciao
ho aperto un nuovo post
Newbie & programmi 2° Parte
Lele



 direttamente senza dover ricorrere a funzione apposite delle librerie.
Ed e' proprio per quelle situazioni che esiste std::string::c_str() .
Ciao,
Nicola