sketch spesso errati...

ciao, da due settimane spesso mi capita di ricercare sul web, e quindi praticamente ovunque capiti sketch.
bene a parte i primi sperimentali, su led o altro, tutti gli skech moolto più interessanti per il mio progetto una volta caricati hanno mostrato errori.
intendo dire che ho provato a caricarne su temi come collegamento rc da modellismo, servi in combinazione con la ricevente, ma poi il risultato è stato fallimentare.
la cosa sulla quale ho proprio bisogno di voi è il modo per interpretare i messaggi di errore di arduino, in fase di verifica skech.
per me sono come geroglifici !!! e come posso correggere o provare a correggere il programma se non capisco dove (relativamente indicato dalla riga di errore) e sopratutto se non capisco come ?!??!
grazie !!!

Metti i messaggi, però...

Cmq gli errori che si possono verificare sono in genere:

  1. lo sketch usa una o più librerie che non ci sono sul sistema. Soluzione: scaricarle
  2. una libreria che si sta usando è incompatibile con la versione dell'IDE in uso. Soluzione: aggiornare la libreria
  3. lo sketch è stato scritto per una versione diversa dell'IDE. Soluzione: cercare di adattare lo sketch o cercarne uno compatibile con l'IDE che si sta usando

vero i messaggi sarebbero stati di aiuto ma non si possono copiare ed incollare :slight_smile: e quindi...cmq l'obiettivo mio finale sarebbe quello di cogliere la logica dei messaggi in genere, con letture o altro, e poi vedere i vari casi sepcifici. almeno mi sembrava la cosa più ovvia, anzi la cosa più immediata è stata quella di caricare altri programmi simili senza errori :smiley: :smiley: :smiley:
ma volevo cogliere il senso....questo era l'intento.

Perché non puoi copiarli e incollarli?

esempio:

AnalogReadSerial:11: error: expected initializer before 'Serial'
AnalogReadSerial:12: error: expected declaration before '}' token

Ciao Uwe

vero i messaggi sarebbero stati di aiuto ma non si possono copiare ed incollare

come no???? seleziona le righe rosse col mouse che trovi in basso nell'IDE, con ctrl+c le copi e con ctrl+v incolli qui.

per quello che riguarda gli errori ce ne sono veramente tanti ognuno ha un significato, non esiste un criterio generico per spiegarti come e dove cercare l'errore senza vederlo e a volte nonostante si conosca la descrizione dell'errore serve anche guardare lo sketch.

ma come ?!?! ho già imparato qualcosa....io ho fatto solo il tentativo con il tasto destro del mouse adesso ci riprovo.....
codice sano sano preso e copiato :

// R/C RADIO PPM SIGNAL READ (USING TIMER1 INPUT CAPTURE AND OVERFLOW INTERRUPTS)  
// AND SERVO OUTPUT ON OC1A, OC1B pins [Disabled now]  
// SERVO OUTPUT FUNCTION USING TIMER2 OVERFLOW INTERRUPT  
 
#include "conf.h"  
#ifdef SERVODECODE  
#else  
// Timer1 Overflow   
// Detects radio signal lost and generate servo outputs (overflow at 22ms (45Hz))  
ISR(TIMER1_OVF_vect){  
  //TCNT1 = 20000;        // at 16Mhz (0.5us) (65535-20000) = 22 ms (45Hz)  
  //OCR1A = 20000 + (Servo1<<1);  // Output for servos...  
  //OCR1B = 20000 + (Servo2<<1);  
  //TCCR1A = 0xF0;        // Set OC1A/OC1B on Compare Match  
  //TCCR1C = 0xC0;        // Force Output Compare A/B (Start Servo pulse)  
  //TCCR1C = 0x00;          
  //TCCR1A = 0xA0;      // Clear OC1A/OC1B on Compare Match 
 
  TCNT1 = 0;  
  Timer1_last_value=0xFFFF;  // Last value before overflow...  
  // Radio signal lost...  
  radio_status = 0;  
} 
 
// Capture RX pulse train using TIMER 1 CAPTURE INTERRUPT  
// And also send Servo pulses using OCR1A and OCR1B [disabled now]  
// Servo output is synchronized with input pulse train 
 
ISR(TIMER1_CAPT_vect)  
{ 
   if(!bit_is_set(TCCR1B ,ICES1)){          // falling edge?  
         if(Rx_ch == MAX_CHANNELS) {        // This should be the last pulse...  
             Pulses[Rx_ch++] = ICR1;    
             radio_status = 1;              // Rx channels ready...  
          }  
         TCCR1B = 0x42;              // Next time : rising edge  
         Timer1_last_value = TCNT1;  // Take last value before reset          
         TCNT1 = 0;                  // Clear counter 
         // Servo Output on OC1A/OC1B... (syncronised with radio pulse train)  
         //TCCR1A = 0xF0;        // Set OC1A/OC1B on Compare Match  
         //TCCR1C = 0xC0;        // Force Output Compare A/B (Start Servo pulse)  
         //TCCR1C = 0x00;        
         //TCCR1A = 0xA0;       // Clear OC1A/OC1B on Compare Match      
   } 
 
   else {                                 // Rise edge  
          if ((ICR1-ICR1_old) >= SYNC_GAP_LEN){   // SYNC pulse?  
                Rx_ch = 1;                // Channel = 1  
                Pulses[0] = ICR1;  
            }  
          else {  
            if(Rx_ch <= MAX_CHANNELS)  
               Pulses[Rx_ch++] = ICR1;    // Store pulse length  
            if(Rx_ch == MAX_CHANNELS)  
               TCCR1B = 0x02;             // Next time : falling edge  
            } 
    }  
   ICR1_old = ICR1;  
}  
 
// Servo Input PPM Initialization routine  
void RxServoInput_ini()  
{  
  pinMode(icpPin,INPUT);  
  Rx_ch = 1;  
  //TCCR1A = 0xA0;           // Normal operation mode, PWM Operation disabled, clear OC1A/OC1B on Compare Match  
  TCCR1A = 0x00;             // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1 -- PWM11=0,PWM10=0 => PWM   
  TCCR1B = 0x42;             // TCNT1 preescaler/8 (16Mhz => 0.5useg, 8 Mhz => 1useg), Rising edge  
  TIMSK1 = _BV(ICIE1)|_BV (TOIE1);   // Enable interrupts : Timer1 Capture and Timer1 Overflow  
  Neutro[1] = 1037;  
  Neutro[2] = 1037;  
  Neutro[3] = 1037;  
  Neutro[4] = 1037;  
  Servo1 = 1037;  
  Servo2 = 1037;  
} 
 
int RxGetChannelPulseWidth( uint8_t channel)  
{  
  unsigned int result;  
  unsigned int result2;  
  unsigned int pulso_ant;  
  unsigned int pulso_act;   
 
  // Because servo pulse variables are 16 bits and the interrupts are running values could be corrupted.  
  // We dont want to stop interrupts to read radio channels so we have to do two readings to be sure that the value is correct... 
 
  result =  Pulses[channel];  
  result2 =  Pulses[channel];  
  if (result != result2)  
    result =  Pulses[channel];   // if the results are different we make a third reading (this should be fine)  
  pulso_act = result;  
  pulso_ant = Pulses[channel-1];  
  result2 =  Pulses[channel-1];  
  if (pulso_ant != result2)  
     pulso_ant = Pulses[channel-1];   // if the results are different we make a third reading (this should be fine)  
    result = (result - pulso_ant)>>1;        // Restamos con el valor del pulso anterior y pasamos a microsegundos (reloj a 0.5us)   
  if ((result > MIN_IN_PULSE_WIDTH)&&(result < MAX_IN_PULSE_WIDTH))  // Out of range?  
    return result;  
  else  
    {  
    return Neutro[channel];  
    }  
}  
#endif  
 
// SERVO SIGNAL OUTPUT (USING TIMER2 OVERFLOW INTERRUPT AND TIMER1 READINGS)  
ISR (TIMER2_OVF_vect)  
{   
  int us;  
  int aux;  
  if (Servo_Channel < num_servos){  
    Servo_Timer2_timer1_stop = TCNT1;       // take the timer1 value at this moment  
    // Now we are going to calculate the time we need to wait until pulse end  
    if (Servo_Timer2_timer1_stop>Servo_Timer2_timer1_start)   // Timer1 reset during the pulse?  
      Servo_Timer2_pulse_length = Servo_Timer2_timer1_stop-Servo_Timer2_timer1_start;  
    else  
      Servo_Timer2_pulse_length = ((long)Servo_Timer2_timer1_stop + Timer1_last_value) - (long)Servo_Timer2_timer1_start;  
    us = (Servos[Servo_Channel].value) - (Servo_Timer2_pulse_length>>1);  
    us -= 2;  // Adjust for the time of this code  
    if (us>1)  
      {  
      us <<= 2; // Translate us to the 4 cyles loop (1/4 us)  
      __asm__ __volatile__ (  // 4 cycles loop = 1/4 us  (taken from delayMicroSeconds function)  
        "1: sbiw %0,1" "\n\t"            // 2 cycles  
        "brne 1b" : "=w" (us) : "0" (us) // 2 cycles  
        );  
      }  
    digitalWrite( Servos[Servo_Channel].pin,LOW);    // pulse this channel low  
    Servo_Channel++;                                 // increment to the next channel  
    }  
  else  
    Servo_Channel = 0;                // SYNC pulse end => Start again on first channel  
  if (Servo_Channel == num_servos){           // This is the SYNC PULSE  
    TCCR2B = _BV(CS20)|_BV(CS21)|_BV(CS22);   // set prescaler of 1024 => 64us resolution (overflow = 16384uS)   
    TCNT2 = 0x04;   //64usx4 = 256us  
    }  
  else{  
    TCCR2B = _BV(CS20)|_BV(CS22);                  // Set prescaler of 128  (8uS resolution at 16Mhz)   
    TCNT2 = Servos[Servo_Channel].counter;         // Set the clock counter register for the overflow interrupt  
    Servo_Timer2_timer1_start = TCNT1;             // we take the value of Timer1 at the start of the pulse  
    digitalWrite(Servos[Servo_Channel].pin,HIGH);  // Pulse start. Let´s go...  
    }  
}  
 
void Servo_Timer2_ini()  
{   
  // Servos must have correct values at this moment !! Call First Servo_Timer2_set() function...  
  // Variable initialization    
  Servo_Channel = 0;  
  TIMSK2 = 0;  // Disable interrupts   
  TCCR2A = 0;  // normal counting mode   
  TCCR2B = _BV(CS20)|_BV(CS22);            // Set prescaler of 128  (8uS resolution at 16Mhz)  
  TCNT2 = Servos[Servo_Channel].counter;   // Set the clock counter register for the overflow interrupt  
  TIFR2 = _BV(TOV2);  // clear pending interrupts;   
  TIMSK2 =  _BV(TOIE2) ; // enable the overflow interrupt        
}  
 
void Servo_Timer2_set(uint8_t servo_index, int value)  
{  
  int aux; 
  if (value > SERVO_MAX_PULSE_WIDTH)  
    value = SERVO_MAX_PULSE_WIDTH;  
  else if (value < SERVO_MIN_PULSE_WIDTH)  
    value = SERVO_MIN_PULSE_WIDTH;  
  Servos[servo_index].value = value; // Store the desired value on Servo structure  
  value = value - 20;  // We reserve 20us for compensation...  
  // Calculate the overflow interrupt counter (8uS step)  
  aux = value>>3;  // value/8  
  Servos[servo_index].counter = 256 - aux;

ed ecco gli errori

ricevente.ino:7:19: error: conf.h: No such file or directory
ricevente.ino: In function 'void __vector_13()':
ricevente:43: error: 'Timer1_last_value' was not declared in this scope
ricevente:49: error: 'radio_status' was not declared in this scope
ricevente.ino: In function 'void __vector_10()':
ricevente:67: error: 'Rx_ch' was not declared in this scope
ricevente:67: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:69: error: 'Pulses' was not declared in this scope
ricevente:71: error: 'radio_status' was not declared in this scope
ricevente:77: error: 'Timer1_last_value' was not declared in this scope
ricevente:97: error: 'ICR1_old' was not declared in this scope
ricevente:97: error: 'SYNC_GAP_LEN' was not declared in this scope
ricevente:99: error: 'Rx_ch' was not declared in this scope
ricevente:101: error: 'Pulses' was not declared in this scope
ricevente:107: error: 'Rx_ch' was not declared in this scope
ricevente:107: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:109: error: 'Pulses' was not declared in this scope
ricevente:111: error: 'Rx_ch' was not declared in this scope
ricevente:111: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:119: error: 'ICR1_old' was not declared in this scope
ricevente.ino: In function 'void RxServoInput_ini()':
ricevente:133: error: 'icpPin' was not declared in this scope
ricevente:135: error: 'Rx_ch' was not declared in this scope
ricevente:147: error: 'Neutro' was not declared in this scope
ricevente:155: error: 'Servo1' was not declared in this scope
ricevente:157: error: 'Servo2' was not declared in this scope
ricevente.ino: In function 'int RxGetChannelPulseWidth(uint8_t)':
ricevente:181: error: 'Pulses' was not declared in this scope
ricevente:207: error: 'MIN_IN_PULSE_WIDTH' was not declared in this scope
ricevente:207: error: 'MAX_IN_PULSE_WIDTH' was not declared in this scope
ricevente:215: error: 'Neutro' was not declared in this scope
ricevente.ino: In function 'void __vector_9()':
ricevente:237: error: 'Servo_Channel' was not declared in this scope
ricevente:237: error: 'num_servos' was not declared in this scope
ricevente:239: error: 'Servo_Timer2_timer1_stop' was not declared in this scope
ricevente:245: error: 'Servo_Timer2_timer1_start' was not declared in this scope
ricevente:247: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:251: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:251: error: 'Timer1_last_value' was not declared in this scope
ricevente:253: error: 'Servos' was not declared in this scope
ricevente:253: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:285: error: 'Servo_Channel' was not declared in this scope
ricevente:285: error: 'num_servos' was not declared in this scope
ricevente:297: error: 'Servos' was not declared in this scope
ricevente:299: error: 'Servo_Timer2_timer1_start' was not declared in this scope
ricevente.ino: In function 'void Servo_Timer2_ini()':
ricevente:317: error: 'Servo_Channel' was not declared in this scope
ricevente:325: error: 'Servos' was not declared in this scope
ricevente.ino: In function 'void Servo_Timer2_set(uint8_t, int)':
ricevente:343: error: 'SERVO_MAX_PULSE_WIDTH' was not declared in this scope
ricevente:347: error: 'SERVO_MIN_PULSE_WIDTH' was not declared in this scope
ricevente:353: error: 'Servos' was not declared in this scope
ricevente:365: error: expected `}' at end of input

un poco lungo ma ecco il senso...............grazie mille

Nella prima riga c'é:

ricevente.ino:7:19: error: conf.h: No such file or directory

Vuol dire che non trova la libreria conf.h
Tutti gli altri errori sono consegueze della libreria non trovata ad ecezzione di:

ricevente:365: error: expected `}' at end of input

Che potrebbe sigificare che i numero di parentesi aperte non corrisponde al numero di parentesi chiuse. Questo errore comunque potrebbe anche essere una conseguenza della libreria mancante. Vedi se sparische quando hai la libreria.

Hai installata la libreria?

Ciao Uwe

palmirorov:
ciao, da due settimane spesso mi capita di ricercare sul web, e quindi praticamente ovunque capiti sketch.
bene a parte i primi sperimentali, su led o altro, tutti gli skech moolto più interessanti per il mio progetto una volta caricati hanno mostrato errori.
intendo dire che ho provato a caricarne su temi come collegamento rc da modellismo, servi in combinazione con la ricevente, ma poi il risultato è stato fallimentare.
la cosa sulla quale ho proprio bisogno di voi è il modo per interpretare i messaggi di errore di arduino, in fase di verifica skech.
per me sono come geroglifici !!! e come posso correggere o provare a correggere il programma se non capisco dove (relativamente indicato dalla riga di errore) e sopratutto se non capisco come ?!??!
grazie !!!

prendere per " buoni " sketch dalla rete senza che segue il filmato o foto del progetto funzionante è una follia

e poi la strada più giusta e quella di farsi da soli lo sketch su "misura"

gingardu:
e poi la strada più giusta e quella di farsi da soli lo sketch su "misura"

gingardu hai letto il Sketch? Ti sfido a scriverne uno simile.
Ciao Uwe

uwefed:
gingardu hai letto il Sketch? Ti sfido a scriverne uno simile.

+1 :smiley:

gingardu:
e poi la strada più giusta e quella di farsi da soli lo sketch su "misura"

ad ingegneria del software 1 e 2 mi hanno insegnato l'esatto contrario: se si può bisogna sfruttare il già fatto... tutto sommato sbattendosene del come è stato fatto... che dopo la curiosità ti porti al capire come è stato fatto quello è per la ns sete di conoscenza ma non per il fine del progetto.

qsecofr:
ad ingegneria del software 1 e 2 mi hanno insegnato l'esatto contrario: se si può bisogna sfruttare il già fatto... tutto sommato sbattendosene del come è stato fatto... che dopo la curiosità ti porti al capire come è stato fatto quello è per la ns sete di conoscenza ma non per il fine del progetto.

Guarda che il "make or buy" non si applica in questi casi, un conto è comprare un qualcosa che funziona (es. libreria) che richiederebbe mesi di sviluppo perché più conveniente, un conto invece è scaricare dal web a caso del codice che non va che si potrebbe scrivere in poche ore.. :slight_smile:

flz47655:
Guarda che il "make or buy" non si applica in questi casi, un conto è comprare un qualcosa che funziona (es. libreria) che richiederebbe mesi di sviluppo perché più conveniente, un conto invece è scaricare dal web a caso del codice che non va che si potrebbe scrivere in poche ore.. :slight_smile:

questa è una libreria che nella fattispecie muove un servo... gioca con registri ed interrupt per settare timer eccetera...non è proprio una banalità ed è molto più facile sbagliarla che farla giusta: se c'è già, funziona e fa quello che ci serve non vedo perchè non usarla: qui manca un file alla fine. A me sinceramente gli insegnamenti di ingegneria davano fastidio e li per li ho trovati a volte scontati a volte banali a volte noiosi...del resto da studente... però poi quando l'ho fatto per lavoro ho capito che alcune cose non erano proprio così campate in aria e che alle volte è meglio ad esempio fare un codice chiaro che possa essere corretto piuttosto che risparmiare 1 byte di una variabile e tornando allo sfruttamento del codice fatto da altri in realtà è una prassi che facciamo tutti chi più integralmente chi meno ed obiettivamente più ambizioso è il progetto più devi salire sulle spalle dei giganti che ti hanno preceduto.
forse però sono andato un po' troppo ot con questo argomento...mi scuso: solo un'opinione

@palmirorov:

leo72:

  1. lo sketch usa una o più librerie che non ci sono sul sistema. Soluzione: scaricarle

Non basta prendere uno sketch, ricopiarlo e sperare che funzioni.
Devi intanto anche capirne un po' di programmazione e linguaggio C. Se in cima allo sketch vedi degli #include, questi sono "ordini" dati al compilatore di includere altre porzioni di codice che si chiamano librerie. Una libreria è una specie di "estensione" del tuo programma. E' un codice che mette a disposizione del tuo sketch dei nuovi comandi e delle nuove funzioni. Spesso non sono inclusi con l'IDE perché scritti da terzi. Quindi devi procurartele te, altrimenti il tuo sketch non potrà mai essere compilato.

qsecofr:
questa è una libreria che nella fattispecie muove un servo... gioca con registri ed interrupt per settare timer eccetera...non è proprio una banalità ed è molto più facile sbagliarla che farla giusta:

C'é oltre anche un po di codice assembler in mezzo che peggiora da difficoltá di capire/scrivere un codice del genere.

if (us>1)  
      {  
      us <<= 2; // Translate us to the 4 cyles loop (1/4 us)  
      __asm__ __volatile__ (  // 4 cycles loop = 1/4 us  (taken from delayMicroSeconds function)  
        "1: sbiw %0,1" "\n\t"            // 2 cycles  
        "brne 1b" : "=w" (us) : "0" (us) // 2 cycles  
        );  
      }

Cioa Uwe

uwefed:

gingardu:
e poi la strada più giusta e quella di farsi da soli lo sketch su "misura"

gingardu hai letto il Sketch? Ti sfido a scriverne uno simile.
Ciao Uwe

tutto dipende......
da cosa serve lo sketch
certo che se alla fine muove dei servo per l'irrigazione temporizzata del prato non vedo perche non puoi
farti tu il programmino,

poi raramente uno sketch è bello che pronto e giusto per quello che vuoi fare, a meno che non si tratta di un progetto tutto completo e ti va bene cosi,

"alla lunga" dopo che si ha un po di pratica , e meglio scriversi le cose di sana pianta.
le cose funzionanti fatte con la propria testa sono sempre capite e modificabili/migliorabili all'istante

la penso così poi .... magari mi sbaglio non so.

gingardu:
"alla lunga" dopo che si ha un po di pratica , e meglio scriversi le cose di sana pianta.
le cose funzionanti fatte con la propria testa sono sempre capite e modificabili/migliorabili all'istante

la penso così poi .... magari mi sbaglio non so.

no non è che sbagli: è normale che un programmatore capisce meglio quello che fa lui che quello che fanno gli altri ma non è un approccio "ingegneristico" al software... è un po' come stuccare un muro o costruire un condominio: se devi stuccare il muro prendi lo stucco e la spatola e fai, se devi fare un palazzo devi fare un progetto ed usare i mattoni, malte premiscelate e ferro prodotti dagli altri e tu "architetto" devi "solo" conoscere cosa puoi fare con questi componenti.... e a tal fine un'altra cosa che spesso il programmatore fa (sbagliando) è quello di spingersi in codici magari molto ottimizzati ma poco chiari invece il ciclo del software è molto lungo e non si ferma alla prima stesura e quindi è prioritario che il programmatore si "abbassi" a scrivere commenti e precisare cosa fa di modo che lui stesso e gli altri possano metterci mano o correggere senza impazzire...
esempio (citando il codice immesso da uwe :astonished:)
us <<= 2; ... bel metodo per moltiplicare per 4 in modo molto rapido... ottimo metodo per non far capire a nessuno quello che stai scrivendo... (infatti l'autore consapevole ha accennato un commento).... se stai facendo un driver o una ISR sei bravo, se lo commenti sei ancora più bravo, se stai scrivendo un programma di contabilità (o accendere un led ogni morte di papa) pensi tu di essere bravo ma in realtà stai sbagliando tutto.
IN MIA UMILE OPINIONE SEMPRE COMUNQUE E'...

qsecofr:

gingardu:
"alla lunga" dopo che si ha un po di pratica , e meglio scriversi le cose di sana pianta.
le cose funzionanti fatte con la propria testa sono sempre capite e modificabili/migliorabili all'istante

la penso così poi .... magari mi sbaglio non so.

no non è che sbagli: è normale che un programmatore capisce meglio quello che fa lui che quello che fanno gli altri ma non è un approccio "ingegneristico" al software... è un po' come stuccare un muro o costruire un condominio: se devi stuccare il muro prendi lo stucco e la spatola e fai, se devi fare un palazzo devi fare un progetto ed usare i mattoni, malte premiscelate e ferro prodotti dagli altri e tu "architetto" devi "solo" conoscere cosa puoi fare con questi componenti.... e a tal fine un'altra cosa che spesso il programmatore fa (sbagliando) è quello di spingersi in codici magari molto ottimizzati ma poco chiari invece il ciclo del software è molto lungo e non si ferma alla prima stesura e quindi è prioritario che il programmatore si "abbassi" a scrivere commenti e precisare cosa fa di modo che lui stesso e gli altri possano metterci mano o correggere senza impazzire...
esempio (citando il codice immesso da uwe :astonished:)
us <<= 2; ... bel metodo per moltiplicare per 4 in modo molto rapido... ottimo metodo per non far capire a nessuno quello che stai scrivendo... (infatti l'autore consapevole ha accennato un commento).... se stai facendo un driver o una ISR sei bravo, se lo commenti sei ancora più bravo, se stai scrivendo un programma di contabilità (o accendere un led ogni morte di papa) pensi tu di essere bravo ma in realtà stai sbagliando tutto.
IN MIA UMILE OPINIONE SEMPRE COMUNQUE E'...

In buona sostanza condivido, tranne per il giudizio; bravo, più bravo ecc. Non ho capito l'ultima parte riguardo al programma di contabilità, mi sembra di capire che chi scrive un programma di contabilità sia meno "bravo" di chi scrive una ISR. Ovviamente non è così, perchè sono lavori complessi entrambe e richiedono competenze diverse.

Riguardo ai commenti sul codice, posso dire evitando di usare la parola "bravo" che se è intesa in modo corretto ci può stare.
Se sei in grado di scrivere codice e contemporaneamente commentarlo mantenendo in sincro il codice con la documentazione hai sicuramente una capacità in più, capacità che si può acquisire con il tempo. Mi prendo come esempio da non seguire: io non ho la capacità di scrivere codice e commentarlo, forse mi lascio prendere dal piacere di scrivere codice di getto, e questa la mia natura.

Purtroppo poi ci sbatti il muso, e con il tempo visioni tanto codice altrui e si viene a creare la situazione assurda in cui risulta più comprensibile il codice altrui che quello scritto di proprio pugno, se questo accade bisogna impegnarsi a scrivere imitando gli altri fino ad acquisire le capacità mancanti.

Così io penso che ci vuole tempo per superare le varie fasi, però chi ha studiato progettazione software ha acquisito anche delle tecniche che lo aiutano ad essere produttivo a 360 gradi, per cui è cosciente che l'analisi va fatta in gruppo, e che dopo una settimana ci deve essere del codice su cui lavorare, su cui effetuare test, questa coscienza fa di lui un programmatore dotato degli strumenti del mestiere, strumenti che un programmatore come me non ha, ma con il tempo e lo studio può rimediare.

Tutta sta tiritera per dire che scrivere codice commentato è buona cosa ed è utile in futuro, ma sbatterci il muso prima possibile è una strada percorribile che da i suoi frutti, quindi scrivete codice su codice non importa se commentato, prima possibile ci sbatterete il muso accorgendovi che dovete trovare una soluzione.

La cosa che può accadere e che con il tempo avete acquisito nuove capacità legate alla programmazione e rivedendo il vostro codice vecchio di 6 mesi noterete mille cose da modifcare perchè non efficienti, perchè errate e questa cosa la noterete sempre magari in misura minore, ma accadrà sempre fino alla completa maturazione che avverà nei dintorni dell'ottantesimo compleanno. XD

Ciao e buone feste.

Concordo in pieno con Mauro.
Sempre commentare il codice.

Non siamo nell'epoca dei computer anni '80 dove la RAM era poca ed i commenti in BASIC erano salvati carattere per carattere insieme al listato per cui ogni commento erano byte tolti al programma. :wink:
Anche a me capitava all'inizio di non commentare, poi ho iniziato a mettere qualche commentino, ora sono arrivato alla condizione in cui nei passaggi critici metto anche un commento per riga (vedi leOS o swRTC) altrimenti se riprendo in mano il codice dopo qualche mese non ci capisco più nulla :stuck_out_tongue_closed_eyes: