Logica sul funzionamento del passaggio valore a funzione

Ciao Ragazzi , buonasera,
premetto che ce la sto mettendo tutta e capisco di essere banale nel porre certe domande…ma senza le vostre risposte e topic vari… avrei grossi problemi. Quindi riassumendo…sono una capra in programmazione e sono anche lungi da avere una mentalità da programmatore ( anche se vorrei scrivere fin da subito bene lo sketch)…
qui sotto incollerò uno sketch gia pronto fornito con il sensore che ho acquistato ( un ph meter) questo codice lo devo inserire all’interno del mio sketch ( file .h) ed ovviamente va modificato perche “cucu” che funziona con i suoi loop e setup :frowning: …comunque vorrei chiedervi spiegazioni su 2 passaggi ed una domanda:

  1. alla dichiarazione della funzione “avergearray” che trovate in “voltage = avergearray(pHArray, ArrayLenth)5.0/1024;" vengono assegnati i valori dalle variabili pHArray e ArrayLenth, quando poi vado alla chiamata "double avergearray(int arr, int number)” immagino che quei valori vengano passati rispettivamente ad “int* arr” ed “int number” che poi vendo richiamati dentro la funzione vengono elaborati… corretto? :slight_smile:
    2)perche hanno usato “int* arr”? vorrebbe dire che è un valore passato come riferimento…ma mi aspettavo di trovare nel codice anche una “&” su “pHArray”
  2. la domanda… per richiamare tutto questo sketch in un mio “programma” :zipper_mouth_face: (scusate la parolona) ho pensato di usare nel mio file .ino questa “ideona” vado nel file.c cancello il setup ed il loop racchiudo tutto dentro un ciclo for altrimenti “if(number<=0)” mi farebbe subito uscire e racchiudo tutto in una funzione che chiamerò boiata(). :grinning: :grinning:
    Nel mio file .ino nel loop e sotto uno stato del “switch/case” faro la chiamata alla mia funzione…che ne pensate?

Grazie a tutti e sperando di avervi fatto anche ridere
vi saluto
Francesco

/*
 # This sample code is used to test the pH meter V1.0.
 # Editor : YouYou
 # Ver    : 1.0
 # Product: analog pH meter
 # SKU    : SEN0161
*/
#define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00            //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection
int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0;
void setup(void)
{
  pinMode(LED,OUTPUT);
  Serial.begin(9600);
  Serial.println("pH meter experiment!");    //Test the serial monitor
}
void loop(void)
{
  static unsigned long samplingTime = millis();
  static unsigned long printTime = millis();
  static float pHValue,voltage;
  if(millis()-samplingTime > samplingInterval)
  {
      pHArray[pHArrayIndex++]=analogRead(SensorPin);
      if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
      voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
      pHValue = 3.5*voltage+Offset;
      samplingTime=millis();
  }
  if(millis() - printTime > printInterval)   //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
  {
    Serial.print("Voltage:");
        Serial.print(voltage,2);
        Serial.print("    pH value: ");
    Serial.println(pHValue,2);
        digitalWrite(LED,digitalRead(LED)^1);
        printTime=millis();
  }
}
double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    Serial.println("Error number for the array to avraging!/n");
    return 0;
  }
  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i<number;i++){
      amount+=arr[i];
    }
    avg = amount/number;
    return avg;
  }else{
    if(arr[0]<arr[1]){
      min = arr[0];max=arr[1];
    }
    else{
      min=arr[1];max=arr[0];
    }
    for(i=2;i<number;i++){
      if(arr[i]<min){
        amount+=min;        //arr<min
        min=arr[i];
      }else {
        if(arr[i]>max){
          amount+=max;    //arr>max
          max=arr[i];
        }else{
          amount+=arr[i]; //min<=arr<=max
        }
      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}
  1. Corretto, a parte l'inversione dei termini dichiarazione (meglio definizione) e chiamata. Nella chiamata si passano gli argomenti (variabili o costanti), nella definizione della funzione si elencano i parametri (variabili locali) che ricevono i valori degli argomenti.
  2. Il nome di un array è già un puntatore per cui nella chiamata alla funzione si passa il puntatore, non l'indirizzo del puntatore. Per rendere un po' più chiaro che la funzione riceve un array, la definizione potrebbe anche essere scritta così:
double avergearray(int arr[], int number)
  1. Non ho ben capito la struttura della boiata :slight_smile: Nel senso che l'idea mi sembra giusta, ma non so i dettagli.

Claudio_FF:

  1. Corretto, a parte l'inversione dei termini dichiarazione (meglio definizione) e chiamata. Nella chiamata si passano gli argomenti (variabili o costanti), nella definizione della funzione si elencano i parametri (variabili locali) che ricevono i valori degli argomenti.
  2. Il nome di un array è già un puntatore per cui nella chiamata alla funzione si passa il puntatore, non l'indirizzo del puntatore. Per rendere un po' più chiaro che la funzione riceve un array, la definizione potrebbe anche essere scritta così:
double avergearray(int arr[], int number)
  1. Non ho ben capito la struttura della boiata :slight_smile: Nel senso che l'idea mi sembra giusta, ma non so i dettagli.

Grazie Mille!!!!!