La mia ignoranza non ha limiti :) Dubbi sui "Linguaggi C"

Sera a tutti!

L'altro giorno parlando con un amico ,ho intrapreso "la differenza fra c e c++" ... e nessuno dei due ne sapeva niente... perciò ci siamo messi a cercare su internet qualcosa , un po senza voglia :slight_smile: infatti dopo un po abbiamo lasciato l'argomento e abbiamo fatto altro ( giocare al pc ) però io ammetto di averci pensato 8) e non ne sono venuto ancora a capo :roll_eyes:

Le mie domande sono :

Qual'è la differenza sostanziare fra c e c++? Ho letto che il c++ è una versione più recente e che si occupa di "oggetti" , che si intende per "Oggetti"?
Qual'è fra i due il migliore per programmare Arduino?

A causa della mia ignoranza , anche se ho conoscenze riguardo il linguaggio C , sto seguendo alcuni video-corso su internet che partono da 0. Forse del mio dubbio , avrò chiarimenti in tali video , ma qualche info più approfondita non mi fa male :smiley: .
Non osservate la mia ignoranza , Osservate il mio impegno :grin:

Detto in linguaggio per "Ignoranti totali":

Il C sostanzialmente ha delle Funzioni, ovvero un insieme di istruzioni che... messe insieme fanno un lavoro (una Funzione appunto) più complesso delle singole istruzioni, con uno scopo particolare.

Per far lampeggiare un LEd puoi usare delle singole istruzioni tipo:

digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second

Oppure ti puoi inventare una tua Funzione che puoi chiamare come vuoi, per esempio Pippo Baudo() che contiene quelle istruzioni:

Pippo Baudo()
{
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}

Chiamando la funzione Pippo Baudo() (che può essere nascosta in qualche altro file) farai lo stesso lampeggiare il LED.

Il C++, detto in termini Bovini, ha le Classi, ovvero un insieme di Funzioni, quindi più funzioni messe insieme, fanno una Classe particolare.

Ricapitolando: allo stesso modo che una Funzione è composta da istruzioni, una Classe è composta da Funzioni (che a sua volta è composta da istruzioni semplici).

In realtà sono oggetti più complessi, strutture dati composte da Funzioni, ma per capire alla bella e meglio, va bene questa descrizione.

Se cerchi in rete "c vs c++" trovi tanti articoli che analizzano le differenze, che sono non solo di livello stilistico ma anche proprio di livello strutturale.
Tipo questo:
http://web.eecs.utk.edu/~huangj/CS302S04/notes/c_versus_c++.html

Detta in maniera sbrigativa:
Il C è un linguaggio strutturato classico, dove le istruzioni o funzioni devono essere scritte in maniera "corretta" secondo una strutturazione logica. Si scoraggia l'uso del goto che farebbe diventare il codice "a spaghetti", molto intrecciato.
Ma per i dati ovvero le variabili non ci sono "regole" pressanti. Nessuno vieta di mettere tra le variabili globali, variabili che vengono usate da più funzioni o parti logiche del programma che non c'entrano nulla tra loro.
Poi nasce il C++ con la filosofia degli oggetti (non nata con il C++).
In questo caso una classe serve per "racchiudere" dentro di se non solo le funzioni (azioni) che gli oggetti di quella classe sono in grado di fare ma anche i dati su cui agiscono.

Su una piccola MCU come Arduino il C++ ovvero le classi vengono per lo più usate per le librerie. Il C++ è leggermente più pesante come occupazione di memoria e siccome Arduino di RAM ne ha poca... A volte nelle librerie trovi addirittura pezzi di codice in assembly o codice che usai direttamente i registri interni della CPU per risparmiare spazio.

Esempio voglio gestire una variabile per contare i pezzi di qualcosa (potrebbe essere un micro che controlla i pezzi in produzione di officina)
Voglio una variabile e delle funzioni che agiscono su quella variabile ma in realtà chiunque può lavorare con quella variabile, non è nascosta e visibile alle sole funzioni (si potrebbe usare un'altra tecnica per celarla ma di base non puoi).

  1. solo C :
int contaPezzi=0;

int quantiPezzi() 
{ return(contaPezzi);
}

void incrementaPezzi(int x)
{ if( x > 0) contaPezzi=contaPezzi+x;
}

void setup()
{ Serial.begin(9600);
  contaPezzi=3;            // non solo la funzione può agire sulla variabile, vorrei evitare questo
  incrementaPezzi(10); 
  Serial.println(quantiPezzi());
}

void loop(){}
  1. stile C++
class Pezzi
{ private: 
     int contaPezzi;
  public:
    Pezzi() { contaPezzi=0; }
    int quantiPezzi() { return(contaPezzi); }
    void incrementaPezzi(int x) { if( x > 0) contaPezzi=contaPezzi+x; }
};

Pezzi myPezzi();

void setup()
{ Serial.begin(9600);
  myPezzi.contaPezzi=3;    // errore di compilazione, la variabile è "nascosta"
  myPezzi.incrementaPezzi(10);  
  Serial.println(myPezzi.quantiPezzi());
}
void loop(){}

In versione C++ la variabile e le funzioni sono "accorpate".

Inoltre nessuno vieta di creare più oggetti di classe contaPezzi.
Pezzi myPezzi1(), myPezzi2();
Avrai due contatori.

In C per farlo dovresti duplicare la variabile e le funzioni e associare alle funzioni la variabile giusta.

Ottimo Nid. :grin:

Purtroppo in italiano avevo 5 e si vede, anzi si legge :blush:

Non so di aver capito :blush: ... mi sento tanto stupido =(

L'ignoranza non è stupidità :wink:
Devi studiare un pò di programmazione, non ci vedo nulla di male.

Il core di Arduino e molte delle librerie ufficiali e di terzi sono in C++ per cui mi sentirei di consigliarti di iniziare con un testo di C++, anche se una lettura di una guida in C male non ti farebbe se sei a digiuno di programmazione.

In pratica il C++ ti permette di definire dei nuovi tipi di variabili con caratteristiche complesse partendo da tipi già esistenti. Come ha già detto nid un oggetto definito come un agglomerato di funzioni che agiscono su di esso(che prendono il nome di metodi) e gli oggetti interni che ne definiscono lo stato.
Ad esempio se prendi una persona potresti pensare di cambiarle casa o nome oppure vestiti. Quindi una classe persona conterrà all'interno di essa 3 metodi: uno per cambiare l'indirizzo di casa,uno per cambiarle il nome e l'ultimo per cambiare vestiti. Questi 3 metodi agiscono su 3 stati interni che corrispondono a dei parametri dell'oggetto. In questo caso i parametri sono 3 stringhe ma potresti aggiungerne altri come l'età(int) oppure l'altezza(float/double).
Alla fine crei oggetti tipo persona nel tuo programma.
Ovviamente i vantaggi della OOP non finiscono qui ma spero che tu abbia capito il concetto base sul quale poi si aggiungono tante belle cosucce :).

leo72:
... mi sentirei di consigliarti di iniziare con un testo di C++ ...

Leo ... sei un eretico ... vedrò di organizzare assieme ad Astro il rogo per te ... :grin: XD :grin: XD :grin: XD

Guglielmo

a priori la differenza non sta tanto nel C vs C++, ma nei linguaggi Strutturati (come il C) Programmazione strutturata - Wikipedia e linguaggi ad Oggetti (come il C++) Programmazione orientata agli oggetti - Wikipedia

In generale gli oggetti semplificano molto la vita del programmatore, in cambio di una piccola perdita di performance. Su un normale PC la perdita è tanto minima da essere sempre preferito il linguiaggio ad oggetti, salvo particolari casi.

Guglielmo, conosco il tuo punto di vista, lo condivido e mi sento di diffondere il verbo quando posso :wink:
Ma il core di Arduino è scritto in C++ così come la stragrande maggioranza delle librerie. Se in uno sketch di Arduino cerchi di usare solo il C non credo che il vantaggio in termini di risparmio di risorse rispetto ad uno sketch che usa il C++ sia rilevante dato che lo sketch viene "affogato" in un mare di file .cpp e compilato come tale.

Vero Leo, è C++ ed anche discreta abbondanza di assembler ... ma è scritto, buona parte, da gente che (più o meno) sa quello che scrive ...

... se magari uno che inizia, inizia prima con il C e poi, dove strettamente necessario passa a C++ ... ci salviamo da un po' di problemi (... classe String ad esempio :grin:) :wink:

Guglielmo

Bene.... dovremmo iniziare a scrivere un testo --> "Impariamo il C con Arduino" orientato più sulla parte di programmazione che su quella dell'elettronica.

... esiste già questo : Beginning C for Arduino - Free download, Code examples, Book reviews, Online preview, PDF XD

Guglielmo

P.S. : moderatore ... questo mi sembra un sito "legale", nonostante si possa scaricare l'eBook gratuitamente ... c'è una nota : "Reproduction of site books is authorized only for informative purposes and strictly for personal, private use." ... se non lo fosse ... rimuoviamo subito il link ...

Ragazzi credo che sia anche un problema di linguaggio utilizzato, e non mi riferisco al C o C++

Intendo il linguaggio usato per insegnare. Se uno è completamente digiuno, parlare di linguaggio strutturato, oppure:

"In pratica il C++ ti permette di definire dei nuovi tipi di variabili con caratteristiche complesse partendo da tipi già esistenti. Come ha già detto nid un oggetto definito come un agglomerato di funzioni che agiscono su di esso(che prendono il nome di metodi) e gli oggetti interni che ne definiscono lo stato."

È il classico linguaggio per chi sa già di cosa sta parlando. Io ti capisco... ma lui no!

A volte è meglio semplificazioni estreme e inesattezze che facciano capire qualcosa, piuttosto che precise indicazioni che però non insegno nulla.

se segui il link che ho in firma (Arduino Playground - Newbie) trovi un link ad un buon (per principianti) corso C. In italiano.

Secondo me ha poco senso chiedersi qual'è la differenza tra il liguaggio C e il C++. Le differenze ci sono ma non si può dire il C e quadrato con gli spigoli vivi e il C++ è quadrato ma con gli spigoli smussati. Ci sono tante differenza che se descritte non possono essere comprese immediatamente, per di più nello spazio limitato di un forum non si può dare una descrizione esaustiva, non solo il rischio di non capirci nulla è alto e si finisce con prendere fischi per fiaschi.

Con arduino non è possibile scrivere codice C e compilarlo con il compilatore C. Se proprio si vuole attivare il compilatore C, si deve creare una libreria o un modulo (file) con estensione ".c", oppure con estensione ".asm" nel caso si voglia scrivere un modulo in linguaggui assembly. Il normale file ".ino" viene compilato con il compilatore C++. In ogni caso il linker per forza di cose deve essere il linker del C++, diversamente non funzionerebbe, in quando il linker C non è in grado di gestire i simboli C++.

Pertanto chi vuole assolutamente usare il C con il compilatore C e il linker C non deve usare il core Arduino e le librerie e nemmeno l'IDE. Questo è un altro motivo per il quale non ha molto senso chiedersi la differenza tra C e C++. Però capisco il principiante che si pone il problema: quale linguaggio devo studiare per usare la board arduino? In realtà non si dovrebbe porre neanche questo problema, perchè non dovrebbe temere di studiare un linguaggio in più, come dire: ho studiato python, ma non lo uso più e quindi ho sprecato tempo. Mentre a me rode il fatto che non so programmare in "ada", e non conosco "simula" e "Smalltalk". :stuck_out_tongue:

PS: l'unico modo per capire la differenza tra il C e C++ è assaggiare entrambe, ma si percepiranno le differenze superficiali e non quelle profonde.

infatti vi stae incapponendo troppo sul fatto di C e C++.
Secondo me la "loro" vera domanda è la differenza tra linguaggio strutturato e linguiaggio ad oggetti, ma posta da persone che non ne capisono.