goto

erpomata:
Io non sapevo neache esistesse la goto in arduino. :grin:

Esiste ma è bene non usarla.
Di solito si può sostituire con i test condizionali.

leo72:
Ad esempio, se crei la funzione somma è scontato che tu debba passare almeno 2 valori altrimenti la funzione non avrebbe ragione di essere.

E no:

int somma(int  addendo){
int somma = addendo + addendo;
return somma;
}

:grin:

leo72:
Esiste ma è bene non usarla.

E' dai tempi del basic (Commodore64) che non la uso più. :smiley:

È per questo che mi sono rivolto a voi!!! In un libro sulla programmazione Arduino che aveva comprato un mio amico avevo guardato il goto ma diceva che non era bello da usare e che appunto non lo spiegava. Comunque grazie ancora una volta a casa oggi faccio delle prove :grin:

SUBSEA:
In un libro sulla programmazione Arduino che aveva comprato un mio amico avevo guardato appunto il goto ma diceva che non era bello da usare e che appunto non lo spiegava.

E quindi tu l'hai voluto usare ugualmente? :~

leo72:
Esiste ma è bene non usarla.

Usare la GOTO in C è ammettere la propria sconfitta come programmatore :grin:

erpomata:

leo72:
Ad esempio, se crei la funzione somma è scontato che tu debba passare almeno 2 valori altrimenti la funzione non avrebbe ragione di essere.

E no:

Potrei cancellarti tutti i post, per questo, lo sai? ]:smiley:

E' dai tempi del basic (Commodore64) che non la uso più. :smiley:

Da quando studiai il Turbo Pascal eliminai il goto dai miei programmi.

Quoto la seconda. :smiley:

mi sembra più elegante il goto che un copia/incolla del codice con dei delay in mezzo per ogni carattere! :stuck_out_tongue_closed_eyes: comunque cosa mi consigliate di usare? degli if e degli serial.print?

Ma che devi fare?
Ci fai vedere un pezzo di codice?

SUBSEA:
mi sembra più elegante il goto che un copia/incolla del cosice con dei delay in mezzo per ogni carattere!

Non ho capito che devi fare.

astrobeed:

leo72:
Esiste ma è bene non usarla.

Usare la GOTO in C è ammettere la propria sconfitta come programmatore :grin:

Io paragono goto alla foglia di fico.

Usare il goto equivale a pulirsi il sedere con la foglia di fico. :grin:

Non è che viene proprio bene, ma se sei nella foresta e ti scappa, non vedo altra soluzione, tra l'altro raggiungi l'obbiettivo velocemente come veloce è il goto.

PS: Survival: Foglia di fico o altra pianta dal fogliame grande va pure bene. :stuck_out_tongue:

Ciao.

Certo! Allora, praticamente ho scritto del cosice per ogni lettera/numero. Per esempio posto la A

{
      Serial.println(dato,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale, Data, LSBFIRST, dato);
      digitalWrite(Abilitazione, HIGH);
      dato=0b100000100;
    
      Serial.println(dato1,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale1, Data1, LSBFIRST, dato1);
      digitalWrite(Abilitazione, HIGH);
      dato1=0b10010000;
    
      Serial.println(dato2,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale2, Data2, LSBFIRST, dato2);
      digitalWrite(Abilitazione, HIGH);
      dato2=0b11010000;
    
      Serial.println(dato3,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale3, Data3, LSBFIRST, dato3);
      digitalWrite(Abilitazione, HIGH);
      dato3=0b10010000;
    
      Serial.println(dato4,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale4, Data4, LSBFIRST, dato4);
      digitalWrite(Abilitazione, HIGH);
      dato4=0b10000100;
    }

  delay(500);

poi magari devo far seguire la P, quindi:

{
    Serial.println(dato,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale, Data, LSBFIRST, dato);
    digitalWrite(Abilitazione, HIGH);
    dato=0b100000100;
 
    Serial.println(dato1,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale1, Data1, LSBFIRST, dato1);
    digitalWrite(Abilitazione, HIGH);
    dato1=0b10010000;
  
    Serial.println(dato2,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale2, Data2, LSBFIRST, dato2);
    digitalWrite(Abilitazione, HIGH);
    dato2=0b11010000;
 
    Serial.println(dato3,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale3, Data3, LSBFIRST, dato3);
    digitalWrite(Abilitazione, HIGH);
    dato3=0b10010000;
  
    Serial.println(dato4,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale4, Data4, LSBFIRST, dato4);
    digitalWrite(Abilitazione, HIGH);
    dato4=0b10000100;
  }
  delay(500);
  {
    Serial.println(dato,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale, Data, LSBFIRST, dato);
    digitalWrite(Abilitazione, HIGH);
    dato=0b00000000;
  
    Serial.println(dato1,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale1, Data1, LSBFIRST, dato1);
    digitalWrite(Abilitazione, HIGH);
    dato1=0b00000000;
  
    Serial.println(dato2,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale2, Data2, LSBFIRST, dato2);
    digitalWrite(Abilitazione, HIGH);
    dato2=0b00000000;
  
    Serial.println(dato3,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale3, Data3, LSBFIRST, dato3);
    digitalWrite(Abilitazione, HIGH);
    dato3=0b00000000;
  
    Serial.println(dato4,DEC);
    digitalWrite(Abilitazione, LOW);
    shiftOut(Seriale4, Data4, LSBFIRST, dato4);
    digitalWrite(Abilitazione, HIGH);
    dato4=0b00000000;
  }

  delay(500);

capito il problema?

Scusa ci ho capito poco dal quel codice e magari altri più preparati di me ti aiuteranno meglio.
Io ci provo. Ma se fai una cosa del genere?

void scriviLettera(int dataPin, int clock, int value){
      Serial.println(value,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(dataPin, clock, LSBFIRST, value);
      digitalWrite(Abilitazione, HIGH);
      dato=0b100000100;  <-- questo non so a cosa serva.
}

void loop(){
scriviLettera(Seriale, Data, dato);
scriviLettera(Seriale1, Data1, dato1);
scriviLettera(Seriale2, Data2, dato2);
}

ecc...?

Bè l'ho buttato giù così come mi è venuto e soprattutto non l'ho provato.
Vedi un pò

ok, non ho ancora capito come usarla... Dopo che mia mamma mi ha praticamente distrutto il cuboled e averlo ripristinato, sono di nuovo sopra al software, senza capire come creare la funzione da richiamare col goto. Faccio un esempio:

void A(){
digitalWrite(13,HIGH);
}
void setup(){
pinMode(13,OUTPUT);
}
void loop(){
goto A;
}

così per voi va bene? Per l'ide no...

Butta via quel "goto" ...

... basta che scrivi A(); e lui richiama la tua funzione void A() :wink:

Guglielmo

P.S. : Cerca di dimenticarti proprio che esiste il "goto" ... :slight_smile:

Grazie gpb01!!! capito e risolto il problema! Quindi col goto stavo a complicarmi inutilmente la vita, giusto? bè, l'importante è che adesso funzioni!

Usato come lo avevi usato, era proprio sbagliato sintatticamente ... si usa per saltare ad una "label" non per richiamare una funzione e ...

... ripeto, in ogni caso, cerca di dimenticare che esiste quell'istruzione e fa come se non ci fosse ! :wink:

Guglielmo

mmmmm.... purtroppo l'entusiasmo iniziale provato su un blinkè miseramente sfumato quando ho applicato il concetto allo scketch del cubo...
Faccio un esempio per la A e per la B:

int Abilitazione = 8;
int Seriale = 12;
int Data = 13;
int Seriale1 = 10;
int Data1 = 11;
int Seriale2 = 7;
int Data2 = 9;
int Seriale3 = 6;
int Data3 = 5;
int Seriale4 = 4;
int Data4 = 3;
byte dato  = 0;
byte dato1 = 0;
byte dato2 = 0;
byte dato3 = 0;
byte dato4 = 0;

void A(){
  
      Serial.println(dato,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale, Data, LSBFIRST, dato);
      digitalWrite(Abilitazione, HIGH);
      dato=0b100000100;
      Serial.println(dato1,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale1, Data1, LSBFIRST, dato1);
      digitalWrite(Abilitazione, HIGH);
      dato1=0b10010000;
      Serial.println(dato2,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale2, Data2, LSBFIRST, dato2);
      digitalWrite(Abilitazione, HIGH);
      dato2=0b11010000;
      Serial.println(dato3,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale3, Data3, LSBFIRST, dato3);
      digitalWrite(Abilitazione, HIGH);
      dato3=0b10010000;
      Serial.println(dato4,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale4, Data4, LSBFIRST, dato4);
      digitalWrite(Abilitazione, HIGH);
      dato4=0b10000100;
    }
void B(){
  {
    
      Serial.println(dato,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale, Data, LSBFIRST, dato);
      digitalWrite(Abilitazione, HIGH);
      dato=0b111111111;
      Serial.println(dato1,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale1, Data1, LSBFIRST, dato1);
      digitalWrite(Abilitazione, HIGH);
      dato1=0b10110100;
      Serial.println(dato2,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale2, Data2, LSBFIRST, dato2);
      digitalWrite(Abilitazione, HIGH);
      dato2=0b10010100;
      Serial.println(dato3,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale3, Data3, LSBFIRST, dato3);
      digitalWrite(Abilitazione, HIGH);
      dato3=0b10001100;
      Serial.println(dato4,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale4, Data4, LSBFIRST, dato4);
      digitalWrite(Abilitazione, HIGH);
      dato4=0b10000100;
    }
void setup()
{
  pinMode(Abilitazione, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(Seriale, OUTPUT);
  pinMode(Data1, OUTPUT);
  pinMode(Seriale1, OUTPUT);
  pinMode(Data2, OUTPUT);
  pinMode(Seriale2, OUTPUT);
  pinMode(Data3, OUTPUT);
  pinMode(Seriale3, OUTPUT);
  pinMode(Data4, OUTPUT);
  pinMode(Seriale4, OUTPUT);
  Serial.begin(9600);
}
void loop(){
  
  A();
  delay(1000);
  B();
  delay(1000);
}

Praticamente dovrebbe alternare la A e la B ogni secondo, ma la compilazione non va abuon fine... :frowning:

prova a togliere qualche parentesi graffa di troppo

... impara a leggere i messaggi di errore del compilatore e cerca di capirli :wink:

Comunque ... c'è una parentesi graffa di troppo ... guarda la void B() hai messo una graffa subito dopo ed una subito sotto ... :wink:

Se inoltre lasci una riga vuota tra le varie funzioni, migliori la leggibilità !

int Abilitazione = 8;
int Seriale = 12;
int Data = 13;
int Seriale1 = 10;
int Data1 = 11;
int Seriale2 = 7;
int Data2 = 9;
int Seriale3 = 6;
int Data3 = 5;
int Seriale4 = 4;
int Data4 = 3;

byte dato  = 0;
byte dato1 = 0;
byte dato2 = 0;
byte dato3 = 0;
byte dato4 = 0;

void A() {
      Serial.println(dato,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale, Data, LSBFIRST, dato);
      digitalWrite(Abilitazione, HIGH);
      dato=0b100000100;
      Serial.println(dato1,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale1, Data1, LSBFIRST, dato1);
      digitalWrite(Abilitazione, HIGH);
      dato1=0b10010000;
      Serial.println(dato2,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale2, Data2, LSBFIRST, dato2);
      digitalWrite(Abilitazione, HIGH);
      dato2=0b11010000;
      Serial.println(dato3,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale3, Data3, LSBFIRST, dato3);
      digitalWrite(Abilitazione, HIGH);
      dato3=0b10010000;
      Serial.println(dato4,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale4, Data4, LSBFIRST, dato4);
      digitalWrite(Abilitazione, HIGH);
      dato4=0b10000100;
    }

void B() {
      Serial.println(dato,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale, Data, LSBFIRST, dato);
      digitalWrite(Abilitazione, HIGH);
      dato=0b111111111;
      Serial.println(dato1,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale1, Data1, LSBFIRST, dato1);
      digitalWrite(Abilitazione, HIGH);
      dato1=0b10110100;
      Serial.println(dato2,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale2, Data2, LSBFIRST, dato2);
      digitalWrite(Abilitazione, HIGH);
      dato2=0b10010100;
      Serial.println(dato3,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale3, Data3, LSBFIRST, dato3);
      digitalWrite(Abilitazione, HIGH);
      dato3=0b10001100;
      Serial.println(dato4,DEC);
      digitalWrite(Abilitazione, LOW);
      shiftOut(Seriale4, Data4, LSBFIRST, dato4);
      digitalWrite(Abilitazione, HIGH);
      dato4=0b10000100;
    }

void setup() {
  pinMode(Abilitazione, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(Seriale, OUTPUT);
  pinMode(Data1, OUTPUT);
  pinMode(Seriale1, OUTPUT);
  pinMode(Data2, OUTPUT);
  pinMode(Seriale2, OUTPUT);
  pinMode(Data3, OUTPUT);
  pinMode(Seriale3, OUTPUT);
  pinMode(Data4, OUTPUT);
  pinMode(Seriale4, OUTPUT);
  Serial.begin(9600);
}

void loop() {  
  A();
  delay(1000);
  B();
  delay(1000);
}

Guglielmo

Edit : M'ha preceduto Brunello ... lui la fatta breve ... :smiley: :smiley: :smiley: