Pages: [1]   Go Down
Author Topic: array e funzioni  (Read 607 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 312
Posts: 21607
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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;
    }
  }
}
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*

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!
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*

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]
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 312
Posts: 21607
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: