PDA

Visualizza versione completa : c++ include sotto linux



Andy86
20-02-14, 22: 04
:bai

Per la scuola sto cominciando i primi passi in c++, come ide ho scelto eclipse perché già lo uso per smanettare con java.
Ora non capisco se il problema sia eclipse, o le librerie installate nel sistema.

Intanto il prof. ha detto di fare l'import con "#include<iostream.h>", però se non metto il path completo (/usr/include/c++/4.8.1/) da errore in compilazione... non capisco se è una "fisima" di linux o cosa... nel dubbio ho aspettato a interpellare il prof. :boh

Comunque il problema arriva dopo, perché eclipse dice:

Only registered members can view code.

Allora ho provato a modificare (con kate) il file iostream e a mettere il percorso completo in quell'include (#include </usr/include/c++/4.8.1/x86_64-unknown-linux-gnu/bits/c++config.h>), ma spunta fuori un altro errore a catena in c++config.h.

Prima che rischio di andare avanti a editare millemila file, avete qualche dritta?

Tra l'altro devo usare std::cout e std::cin (non ho capito se è una specie di operatore dot) invece di cout e cin, come detto dal prof... ditemi che il c++ non cambia di sistema in sistema... altrimenti divento matto... :wall
Neanche ho iniziato e già ho nostalgia del java. :wall

K.a.o.s.
20-02-14, 23: 09
Ma studiate il C++ prima del C?

Comunque togli il .h:

Only registered members can view code.



Neanche ho iniziato e già ho nostalgia del java. :wall




Pensa che a me Java non piace proprio :tong2

Andy86
20-02-14, 23: 31
:bai

Si, ho visto che in linux non ci sono le estensioni. Però devo comunque indicare il percorso completo, altrimenti non lo vede. :boh



Ma studiate il C++ prima del C?

Cambia qualcosa a parte gli oggetti? Secondo me lui ha scelto un linguaggio solo come riferimento. Il C non l'ha neanche menzionato. :m:
Tra l'altro essendo una scuola di recupero anni, con un ora di lezione a settimana, il tempo a disposizione non dev'essere mica tanto.


Pensa che a me Java non piace proprio :tong2

Uomo di poca fede.
Secondo me sempre meglio un errore di compilazione in più che un crash in esecuzione. :ghgh
Poi magari è solo perché ho iniziato prima con quello, ma come sintassi mi sembra più normale.

K.a.o.s.
20-02-14, 23: 59
Si, ho visto che in linux non ci sono le estensioni. Però devo comunque indicare il percorso completo, altrimenti non lo vede. :boh

Mmm... hai tutti gli header?
Per dire... su Ubuntu vengono installati con il pacchetto build-essential. Su Arch c'è il gruppo base-devel. Su altre distribuzioni ora non ricordo.


Cambia qualcosa a parte gli oggetti? Secondo me lui ha scelto un linguaggio solo come riferimento. Il C non l'ha neanche menzionato. :m:
Tra l'altro essendo una scuola di recupero anni, con un ora di lezione a settimana, il tempo a disposizione non dev'essere mica tanto.Il C++ è un linguaggio che in genere o piace o si odia all'estremo: permette molte cose che rendono il codice un macello da gestire (ad esempio l'eredità multipla) e altri aspetti semplici possono diventare abbastanza oscuri. Padroneggiare bene il C++ è molto complesso.
Al contrario, il C è più semplice e pulito del C++, ma in genere ci si impiega più tempo nella scrittura dei programmi.
Per farti un esempio, Linus Torvalds il C++ non lo può vedere (e credo nemmeno Java).



Uomo di poca fede.
Secondo me sempre meglio un errore di compilazione in più che un crash in esecuzione. :ghgh

No ma la questione è un'altra: Java è poco integrato nel sistema, è lento e non mi piace troppo la sintassi :hap. Certo, dipende dalle esigenze poi.

Poi ti sfido a dire qual'è più chiaro tra questi:

Only registered members can view code.

Only registered members can view code.
l'ultimo è Ruby :tong2. Certo è ancora più lento di Java, ma per applicazioni che non necessitano di particolare velocità, lo adoro.

pierino_89
21-02-14, 01: 04
A morte java e tutte le sue implementazioni! :tong2

In ogni caso, se indicando il percorso completo l'header viene trovato, direi che il problema non è la presenza del build-essential (altrimenti si sarebbe già schiantato sulla mancanza di gcc) ma quanto su un'erronea interpretazione delle variabili di sistema. Chiudi eclipse (che è scritto in java :ghgh) e prova ad usare un editor di testo ignorante (kate o geany) per poi usare direttamente gcc a riga di comando.

Non sono un esperto di c++ (anzi, non ne so niente, io uso solo C puro), ma almeno su queste cose dovremmo trovarci d'accordo :bgg2

ditemi che il c++ non cambia di sistema in sistema... altrimenti divento matto... :wall
Neanche ho iniziato e già ho nostalgia del java. :wall
Non so c++, ma C cambia brutalmente. Ed ho paura che prima o dopo ti scornerai con qualche syscall non portabile (e la portabilità è bella, ma quando scopri cose tipo "epoll" o certi utilizzi dei device files la mandi volentieri a quel paese) :ghgh.

K.a.o.s.
21-02-14, 01: 26
Diamine, mi ero perso che usavi Eclipse per il C++ :ghgh. Anche secondo me, per un corso base, ti conviene usare strumenti più semplici. Gli IDE aggiungono troppa roba di loro in questi casi.


Non so c++, ma C cambia brutalmente. Ed ho paura che prima o dopo ti scornerai con qualche syscall non portabile (e la portabilità è bella, ma quando scopri cose tipo "epoll" o certi utilizzi dei device files la mandi volentieri a quel paese) :ghgh.

Per rigor di logica, essendo le syscall a livello del kernel, penso che sia lo stesso... però non sono né un esperto di portabilità, né di C++ (ho usato più l'Objective-C, che si può dire che non è per nulla portabile :ghgh).

pierino_89
21-02-14, 01: 52
Diamine, mi ero perso che usavi Eclipse per il C++ :ghgh. Anche secondo me, per un corso base, ti conviene usare strumenti più semplici. Gli IDE aggiungono troppa roba di loro in questi casi.
La cosa che mi preoccupa di più sono i Makefile evocati dall'inferno che preparano per i programmi. Io personalmente uso Netbeans, che è bello e tutto, ma il Makefile non ho mai capito cosa faccia, o come faccia a funzionare.



Per rigor di logica, essendo le syscall a livello del kernel, penso che sia lo stesso... però non sono né un esperto di portabilità, né di C++ (ho usato più l'Objective-C, che si può dire che non è per nulla portabile :ghgh).
Objective-C per quanto ne so è direttamente compatibile con C, quindi sono piuttosto sicuro che tutte queste chiamate si possano fare direttamente anche lì.
C++ non lo è, quindi potrebbe avere chili di wrapper per fare le stesse cose e mantenere la portabilità. Ma sono mie supposizioni - tutto ciò che faccio riguarda prodotti embedded estremamente specializzati, quindi meno è portabile e più sono contento :lol:

Andy86
21-02-14, 13: 43
:bai

Intanto buone notizie, oggi eclipse si è svegliato di buon umore ed ha cominciato a funzionare come si deve.
Ieri ho smanettato un po' con pacman e le varie librerie di gcc, non so se ho installato qualcosa che mancava. :boh

Sono anche riuscito a far girare il programmino di compito. :ghgh


prova ad usare un editor di testo ignorante (kate o geany) per poi usare direttamente gcc a riga di comando.

Appunto. E poi mi devo fare tutto a mano.
Io sono innamorato del pulsantino "play" fin dai tempi in cui smanettavo con gamemaker, così ad ogni minima modifica posso testare in esecuzione con due click.


No ma la questione è un'altra: Java è poco integrato nel sistema, è lento e non mi piace troppo la sintassi :hap. Certo, dipende dalle esigenze poi.


Non so chi ha detto che java è lento, a me non è mai sembrato. Certo, l'ho quasi sempre usato per il mobile, ma qualche volta ho provato a fare qualcosa con le swing e non è mai stato lento, almeno non tanto quanto altri programmi pesanti fatti in C/C++.

E poi guarda quando tempo ci mettono a compilare i grossi programmi in c/c++, tipo quelli dei ccr, con java non credo che ci metterà mai così tanto.


Poi ti sfido a dire qual'è più chiaro tra questi:

Faccio il bastian contrario, a me piace il codice indentato su più righe. :lol:

E poi se con la seconda sintassi volessi sapere qual'è il numero di volte che ha già ciclato? magari dovrei fare come il while e gestire la var a mano, quindi addio vantaggio del for. :bgg2

Qualche volta ho provato anche l'enhanced for, ma per abitudine preferisco sempre fare la sintassi normale, che comunque è più o meno quella che ha usato il prof. in pseudo-codice.

pierino_89
21-02-14, 14: 04
Appunto. E poi mi devo fare tutto a mano.
Io sono innamorato del pulsantino "play" fin dai tempi in cui smanettavo con gamemaker, così ad ogni minima modifica posso testare in esecuzione con due click.

Quando studierai il makefile, capirai :ghgh
Eclipse e gli altri editor ne generano uno "volante" per te, ma puoi scriverlo anche da solo.



Non so chi ha detto che java è lento, a me non è mai sembrato. Certo, l'ho quasi sempre usato per il mobile, ma qualche volta ho provato a fare qualcosa con le swing e non è mai stato lento, almeno non tanto quanto altri programmi pesanti fatti in C/C++.
Java è intrinsecamente lento, perché gira su jvm invece che nativamente. Ma il problema più grosso è che mangia ram di diritto e di traverso, perché su un i5 non noterai mai la differenza di velocità di esecuzione fra un programma interpretato o uno compilato. Prova su un dispositivo con processore arm tipo un raspberry, vedrai la differenza. :oo2



E poi guarda quando tempo ci mettono a compilare i grossi programmi in c/c++, tipo quelli dei ccr, con java non credo che ci metterà mai così tanto.
Per forza, java non lo compili. Viene interpretato. Anche quando fai il bytecode, non vai a linkare librerie o altre cose. Il grosso è fatto jit.

Andy86
21-02-14, 14: 40
Ma il problema più grosso è che mangia ram di diritto e di traverso

Secondo me questo lo fanno anche i develop c/c++ che si dimenticano di deallocare i puntatori a mano. :lol:



Per forza, java non lo compili. Viene interpretato. Anche quando fai il bytecode, non vai a linkare librerie o altre cose. Il grosso è fatto jit.

Secondo me, lavoro della cpu a parte, è uno dei punti di forza.
Ma forse sono prevenuto nei confronti della "non portabilità" dei "programmi commerciali". :ghgh

pierino_89
21-02-14, 15: 41
Secondo me questo lo fanno anche i develop c/c++ che si dimenticano di deallocare i puntatori a mano. :lol:
Sì, ma è difficile che con un paio di puntatori partano centinaia di mega. Di solito i problemi evidenti si vedono subito. E comunque avevano solo da usare valgrind (http://valgrind.org/) :tong2

Andy86
21-02-14, 16: 53
Ah, beh. :shock Allora anche in java basta usare jar2exe (http://www.jar2exe.com/). :tong2:ghgh

pierino_89
21-02-14, 19: 01
Che c'entra jar2exe con valgrind? :ohoh

Andy86
21-02-14, 19: 57
Era tanto per dire. Tu hai detto che il problema della memoria di java era legato alla non compilazione, quindi se effettivamente jar2exe compila java, il problema sparisce... o no? :bgg2

K.a.o.s.
21-02-14, 20: 53
Sicuramente la JVM aggiunge memoria e peso al tutto, però bisogna dire che il consumo di ram deriva anche dal fatto che è un linguaggio di "medio-alto" livello e più cerchi di astrarre e avvicinarti alla mentalità del programmatore, più devi aggiungere codice "probabilmente inutile".

Andy86
21-02-14, 21: 47
e avvicinarti alla mentalità del programmatore
Quale programmatore, quello di C? :lol:


linguaggio di "medio-alto" livello e più cerchi di astrarre
Ah, perché in C si può astrarre? :lol:

Io ho sempre odiato il codice compatto e "poco astratto", come quelle istruzioni in bash che le scrivi tutte su una riga sola per copiarle nel terminale. Quando smanetto in java preferisco sempre mettere una classe in più, piuttosto che inglobare tutto il codice in un oggetto solo;
oppure implementare le interfacce (una specie di ereditarietà multipla) direttamente in una classe piuttosto che fare una sottoclasse dedicata, come spesso si vede nei tutorial.

K.a.o.s.
22-02-14, 07: 10
Io ho sempre odiato il codice compatto e "poco astratto", come quelle istruzioni in bash che le scrivi tutte su una riga sola per copiarle nel terminale. Quando smanetto in java preferisco sempre mettere una classe in più, piuttosto che inglobare tutto il codice in un oggetto solo;
oppure implementare le interfacce (una specie di ereditarietà multipla) direttamente in una classe piuttosto che fare una sottoclasse dedicata, come spesso si vede nei tutorial.Ci sono delle "regole" su come vanno usati gli strumenti della programmazione ad oggetti :hap. Sono i principi SOLID (http://it.wikipedia.org/wiki/SOLID), i Design Pattern (http://it.wikipedia.org/wiki/Design_pattern) e tutto ciò che è loro collegato che forma l'ingegneria del software.
Questi principi sono stati sviluppati dall'esperienza. Ci si è accorti infatti che applicarli rende il codice più facilmente modificabile, più gestibile, più comprensibile e meno soggetto a problemi strutturali.

Parlando della compattezza: bisogna trovare un compromesso. Un metodo troppo compatto è difficile da leggere, ma allo stesso modo lo è un metodo che si dilunga troppo. Bisogna sempre ricordare che il codice può essere letto da altri e anche noi, magari dopo alcuni mesi, non ricordiamo tutti i dettagli del codice che abbiamo scritto.
Le linee guida del kernel Linux consigliano che un metodo non sia più lungo di 24-48 linee di codice e 80 caratteri in larghezza. :hap

Ah, perché in C si può astrarre? :lol:
Tutto ciò che si può fare in Java si può fare in C, ma non viceversa :eye. È sempre così. Poi non significa che lo si può fare con la stessa comodità.


Quale programmatore, quello di C? :lol:
Alla mentalità di qualunque programmatore: noi pensiamo in un modo, i computer lavorano in un altro.
Considera una stringa.
In java, o per te, è qualcosa del genere: "stringa".
In C, più a basso livello, è un vettore di interi dove ognuno per convenzione rappresenta un carattere.
['s', 't', 'r', 'i', 'n', 'g', 'a', '\0']
(in realtà dovresti sostituire ogni carattere con i corrispettivi interi, come ad esempio s con 115).
Se scendi a livello di assembly, per il computer sono solo numeri e non esistono caratteri.

Andy86
22-02-14, 12: 43
:bai

Io infatti tendo sempre a fare metodi molto corti, e più classi con pochi metodi piuttosto che una classe enorme, mi viene più naturale così.

La storia delle stringhe la sapevo, e poi è così anche in java, l'oggetto String contiene un array di char, per cui il senso è sempre quello.
Solo che invece di fare "stringa[x]" fai "stringa.charAt(x)", alla fine secondo me non cambia niente in fatto di comodità.

E poi io anche quando astraggo tengo sempre presente la mentalità sequenziale del calcolatore, altrimenti vengono fuori casini enormi. :ghgh

Comunque sei sicuro che array si possa tradurre come vettore?
Perché il vettore in fisica/matematica è un altra cosa... e mi pare in inglese si chiami vector. :m:

K.a.o.s.
22-02-14, 13: 02
Comunque sei sicuro che array si possa tradurre come vettore?
Sì, sono la stessa cosa :eye (se rimangono monodimensionali, altrimenti si parla di matrici).

Solo che invece di fare "stringa[x]" fai "stringa.charAt(x)", alla fine secondo me non cambia niente in fatto di comodità.Sì ma in C non se ne parla nemmeno per sogno di fare str = "hello " + "world" oppure str = "hello"; str = "hello world" :hap.
È completamente diversa la gestione delle stringhe, anche perché in Java sono oggetti mentre in C non esistono gli oggetti.

Andy86
22-02-14, 13: 22
Strano, il prof. le stringhe ce le ha fatte vedere così. Dicendo però che sommarle da errore. :m::boh


Sì, sono la stessa cosa :eye

Proprio la stessa cosa non credo... saranno sinonimi... un vettore (in fisica e mate cartesiana) rappresenta un movimento, e quindi è come minimo bidimensionale "v(x,y)", un array è un insieme di variabili. :m::ohoh

Mamma che casino collegare le materie.

K.a.o.s.
22-02-14, 14: 24
Strano, il prof. le stringhe ce le ha fatte vedere così. Dicendo però che sommarle da errore. :m::boh
Appunto, non è possibile (almeno in C) fare quelle cose, perché funzionano diversamente da Java :hap.


Proprio la stessa cosa non credo... saranno sinonimi... un vettore (in fisica e mate cartesiana) rappresenta un movimento, e quindi è come minimo bidimensionale "v(x,y)", un array è un insieme di variabili. :m::ohoh

Mamma che casino collegare le materie.



Allora, c'è molto da spiegare qui :hap, vediamo se riesco a semplificare...

Devi considerare come salva le informazioni in memoria il computer: un array è una lista consecutiva di valori.
Ipotizza che ogni [] è una "casella di memoria". Una stringa sarebbe così in memoria:

[altri dati in memoria].........[S][T][R][N][G][A][\0][altri dati in memoria]

Non puoi avere tutta la stringa in una variabile (cosa che in Java si può fare ma perché appunto astrae il concetto) perché semplicemente occupa più caselle. Hai piuttosto una variabile che contiene l'indirizzo della prima lettera, ovvero un puntatore che [I]punta alla prima lettera. Ipotizziamo che si chiami *str.
In genere tu per accedere al carattere R fai qualcosa del genere: str[3]. Quello che in realtà stai facendo, è dire di quante caselle ti devi spostare a partire dalla prima. Appunto un movimento.
Infatti potresti anche teoricamente sommare un certo valore a str per ottenere sempre il carattere R. Qualcosa del genere insomma: str2 = str + 3, che è come dire z=x+y, ovvero un vettore. :hap.

C'è qualche imprecisione, ma le precisazioni avrebbero reso il tutto più complicato :eye.
Spero di essermi fatto capire :bgg2, è per questo che in genere insegnano prima il C. Java e i linguaggi di livello più elevato nascondono il funzionamento interno del pc.
Ripeto però che questo si applica al C e non so bene eventuali differenze con il C++.

Andy86
22-02-14, 14: 43
Grazie. Molto interessante. Ho capito, e capisco anche devo avere pazienza. Magari queste cose ce le spiegheranno anche a lezione.

K.a.o.s.
22-02-14, 15: 02
Grazie. Molto interessante. Ho capito, e capisco anche devo avere pazienza. Magari queste cose ce le spiegheranno anche a lezione.
Se vi fanno studiare il Java e il C++ credo sia per rendervi subito pronti ad un eventuale ambito lavorativo :hap, il che non è una cosa per forza negativa. Quelle cose lì sono dei dettagli che vengono spiegati quando lo scopo è insegnare come funziona il computer, non un linguaggio in particolare e richiedono molto tempo.

Andy86
22-02-14, 16: 06
Veramente il java l'ho imparato più o meno da solo su internet più per curiosità che altro, e poi sono anche riuscito a combinarci qualcosa.
A volte saltano fuori anche ottimi tutorial didattici.