Go Down

Topic: array e funzioni (Read 672 times) previous topic - next topic

damosound

salve
con l'ausilio di una funzione, che chiamerò: aggiorna, vorrei andare a modificare un array, in base ad alcune condizioni, vi posto la funzione:
void aggiorna_led(byte led,int Led_state[])
{ for(int i =0;i<5;i++)
   { int j=i+2;
     if(bitRead(led,j)==0)
     {Led_state=0;}
     else
     {Led_state=1;}
   }

ora nel main, invocherò la funzione in questo modo:  aggiorna_led( state_byte, Led_status[]);
dove state_byte è un byte su cui andrò a fare i test, e Led_status è l'array che andrò a modificare.
ora, quello che voglio sapere è se in questo modo, una volta invocata nel main, la funzione, nel main mi troverò l'array   Led_status, modificato secondo l'argoritmo eseguito nella funzione aggiorna, oppure no.
perchè da come mi ricordo, nel linguaggio c, io per modificare l'array in questione, dovevo definire nella funzione un puntatore all' array e lavorare sul puntatore, per modificare direttamente l'array del main...io mi chiedevo se nella suite di arduino, questa cosa funzionasse, anche così come l'ho scritta, oppure devo ricorrere ai puntatori come se stassi programmando in c???
grazie a tutti!


leo72

Puoi usare i puntatori oppure usare variabili globali e risolvere il problema di doverle passare a destra e manca.

Code: [Select]

byte led;
int Led_state[];

(...)
void setup() {
(....)
}

void loop() {
(...)
aggiorna_led();
(...)
}

void aggiorna_led() {
  for(int i =0;i<5;i++) {
    int j=i+2;
    if(bitRead(led,j)==0) {
      Led_state=0;
    }else {
      Led_state=1;
    }
  }
}

lesto

gli array in realtà sono puntatori alla prima cella dei dati (che sono scritti in serie uno dopo l'altro, per questo ti basta sapere dov'è il primo elemento).
Quindi la tua funzione, se modifica una cella dell'array, lo fa globalmente.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

damosound

salve,
ho messo le variabili come globali.
a parte questo, se vado a compilare il il codice ed arduino mi  da degli errori nella compilazione, che sono i seguenti:
bozza_midi_sw.cpp : In function 'void loop()':
bozza_midi_sw.cpp : 73:34:error: expected primary-expression before ']' token

mentre questo è il codice:
Code: [Select]

/*

bozza midi_sw

*/
#include <MIDI.h>
#include <EEPROM.h>
int antirimbalso=30;
int led[5]= {2,3,4,5,6};
int sw[5]= {8,9,10,11,12};
int led_state[5]={0,0,0,0,0};
int sw_state[5]={0,0,0,0,0};
int sw_store=13;
int ssw_store=0;
int led_store=7;
byte statoLed=0;
int addr=0;
byte indirizzo=0;
byte led_st;
//funzioni

//-----------------------------xor print
void xorPrint(int sw, int rel)
{
   if(digitalRead(rel)==LOW)
      {digitalWrite(rel,HIGH);
      }
   else
   {digitalWrite(rel,LOW);}
}
//-------------------------------------------aggiorna led
void aggiorna_led(byte led,int Led_state[])
{ for(int i =0;i<5;i++)
   { int j=i+2;
     if(bitRead(led,j)==0)
     {Led_state[i]=0;}
     else
     {Led_state[i]=1;}
   }
 
}

//setup

void setup()
{
   MIDI.begin();     
  int i=0;
  for(i=0;i<5;i++)
  {pinMode(led[i],OUTPUT);}
  pinMode(led_store,OUTPUT);
  i=0;
  for(i=0;i<5;i++)
  {pinMode(sw[i],INPUT);}
  pinMode(sw_store,INPUT);
  }
 
  void loop()
{

  if (MIDI.read()) {                    // Is there a MIDI message incoming ?
    switch(MIDI.getType()) { // Get the type of the message we caught
      case ProgramChange:               // If it is a Program Change
indirizzo= MIDI.getData1();
        default:
        break;
    }
 
// leggo la locazione indirizzo dalla eeprom
byte led_stat = EEPROM.read(indirizzo);
//aggiorno lo stato dei led
aggiorna_led(led_stat,led_state[]);
                    }
 
int j;
  for(j=0;j<5;j++)
  {
  sw_state[j]=digitalRead(sw[j]);
  }
  int ssw_store=digitalRead(sw_store);
 
  if(sw_state[0]==LOW||sw_state[1]==LOW||sw_state[2]==LOW||sw_state[3]==LOW||sw_state[4]==LOW)
{
  delay(antirimbalso);
  for(j=0;j<5;j++)
  {
    if(sw_state[j]==0)
       {xorPrint(sw[j],led[j]);}
  }
}
}



l'errore di compilazione sparisce, se levo le parentesi quadre alla variabile led_state[] , quando richiamo la funzione "aggiorna_led", facendola diventare così;
aggiorna_led(led_stat,led_state);

ma a questo punto non so se va bene per il mio scopo, dato che voglio passare un array e non una variabile!
fatemi sapere vi ringrazio!

superlol


salve,
ho messo le variabili come globali.
a parte questo, se vado a compilare il il codice ed arduino mi  da degli errori nella compilazione, che sono i seguenti:
bozza_midi_sw.cpp : In function 'void loop()':
bozza_midi_sw.cpp : 73:34:error: expected primary-expression before ']' token

mentre questo è il codice:
Code: [Select]

/*

bozza midi_sw

*/
#include <MIDI.h>
#include <EEPROM.h>
int antirimbalso=30;
int led[5]= {2,3,4,5,6};
int sw[5]= {8,9,10,11,12};
int led_state[5]={0,0,0,0,0};
int sw_state[5]={0,0,0,0,0};
int sw_store=13;
int ssw_store=0;
int led_store=7;
byte statoLed=0;
int addr=0;
byte indirizzo=0;
byte led_st;
//funzioni

//-----------------------------xor print
void xorPrint(int sw, int rel)
{
   if(digitalRead(rel)==LOW)
      {digitalWrite(rel,HIGH);
      }
   else
   {digitalWrite(rel,LOW);}
}
//-------------------------------------------aggiorna led
void aggiorna_led(byte led,int Led_state[])
{ for(int i =0;i<5;i++)
   { int j=i+2;
     if(bitRead(led,j)==0)
     {Led_state[i]=0;}
     else
     {Led_state[i]=1;}
   }
 
}

//setup

void setup()
{
   MIDI.begin();     
  int i=0;
  for(i=0;i<5;i++)
  {pinMode(led[i],OUTPUT);}
  pinMode(led_store,OUTPUT);
  i=0;
  for(i=0;i<5;i++)
  {pinMode(sw[i],INPUT);}
  pinMode(sw_store,INPUT);
  }
 
  void loop()
{

  if (MIDI.read()) {                    // Is there a MIDI message incoming ?
    switch(MIDI.getType()) { // Get the type of the message we caught
      case ProgramChange:               // If it is a Program Change
indirizzo= MIDI.getData1();
        default:
        break;
    }
 
// leggo la locazione indirizzo dalla eeprom
byte led_stat = EEPROM.read(indirizzo);
//aggiorno lo stato dei led
aggiorna_led(led_stat,led_state[]);
                    }
 
int j;
  for(j=0;j<5;j++)
  {
  sw_state[j]=digitalRead(sw[j]);
  }
  int ssw_store=digitalRead(sw_store);
 
  if(sw_state[0]==LOW||sw_state[1]==LOW||sw_state[2]==LOW||sw_state[3]==LOW||sw_state[4]==LOW)
{
  delay(antirimbalso);
  for(j=0;j<5;j++)
  {
    if(sw_state[j]==0)
       {xorPrint(sw[j],led[j]);}
  }
}
}





ma a questo punto non so se va bene per il mio scopo, dato che voglio passare un array e non una variabile!
fatemi sapere vi ringrazio!

in teoria tu passi comunque un array quindi dovrebbe funzionare uguale..
in genere le pasentesi quadre non venivano utilizzate per indicare un determinato valore nell'array oppure per inizializzarlo?

se io dico a[]={0, 0, 0, 0}
quando lo passo a una funzione lo passo come a e non a[] almeno a me ha sempre funzionato così.
se invece volevo passare un valore passavo a[3] o a[0]
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

damosound

non voglio passare un determinato valore dell'array, ma tutto l'array!


superlol


non voglio passare un determinato valore dell'array, ma tutto l'array!



appunto ma non devi mettere le parentesi quadre dopo il nome dell'array  XD
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

leo72

@damosound:
prima dichiari delle variabili/array come globali e poi continui a passarle alle funzioni....  :smiley-sweat:
Non serve, una variabile o un array definito come globale viene visto in tutto il programma quindi non importa che tu continui a mettere aggiorna_led(led,Led_state[]) per chiamare aggiorna_led

lesto


@damosound:
prima dichiari delle variabili/array come globali e poi continui a passarle alle funzioni....  :smiley-sweat:

effettivamente è un comportamento alquanto masochistico  :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up