Utilizzo di String

Scusate per le domande da nabbo ma purtroppo non ci arrivo sulla gestione delle stringhe.

  1. è normale che il valore di una stringa si resetti ad ogni loop?
  2. si può copiare il contenuto di una stringa in un'altra?

grazie

  1. no

per risposte piú dettagliate dacci lo sketch.
Ciao Uwe

Grazie Uwe

#include <Wire.h>
char MINCLK[]="0";
int y = 60;

void setup(){
  Serial.begin(9600);
  Wire.begin(3);                // entra nel bus I2C con indirizzo 3
}

void loop(){
  Wire.beginTransmission(0x68);  
  Wire.write((byte)0x00);  
  Wire.endTransmission();  
  Wire.requestFrom(0x68, 7);  
  byte secondi = Wire.read();  
  byte minuti = Wire.read();  
  byte ora = Wire.read();  
  byte giorno_sett = Wire.read();  
  byte giorno_mese = Wire.read();  
  byte mese = Wire.read();  
  byte anno = Wire.read();
  Serial.print("Orario corrente: ");  
  Serial.print(ora, HEX);  
  Serial.print(":");  
  if (minuti<10){  
    Serial.print("0");  
  }  
  Serial.print(minuti, HEX);  
  Serial.print(":");  
  if (secondi<10){    
    Serial.print("0");  
  }  
  Serial.println(secondi, HEX);
  String ORA = String(ora, HEX);
  String MIN = String(minuti, HEX);

  if (MIN > MINCLK){
    Serial.println("MAGGIORE");
    String MINCLK = String(minuti, HEX);

}

  delay(1000);
}

il mio scopo e di comparare MIN con MINCLK in modo da creare un contatore che conta i minuti di accensione di una lampada. Questo è un estratto del codice completo dove piloto luci e pulsanti, ma il problema è qui...

String MINCLK = String(minuti, HEX);

così facendo stai creando una variabile locale al blocco if, che non centra niente con la variabile globale.
Quindi questa variabile esisterà solo all'interno del blocco if.

per fare in modo che ciò non avvenga, la variabile globale da array di char (stringa del c) la fai diventare CLASSE String (c++), e poi

MINCLK = minuti

dovresti evitare anche di fare "String", new String invece dovrebbe andare bene... ma non sono sicuro al 100%

grazie Lesto, ma non ho capito.. provero a studiare le classi e gli array.

Dovrebbe essere sufficiente creare un oggetto stringa all'esterno da ogni funzione, e usare questo al loro interno.

Non conviene scomodare operatore new, se se ne può fare a meno e meglio, anche perchè poi deve fare "delete".

In pratica le variabili dichiarate dentro un blocco rimangono visibili dentro questo blocco, e terminato l'esecuzione del blocco lo spazio occupato viene liberato e quindi vengono distrutti gli oggetti tutto.
Un blocco è {} per cui una funzione è un blocco e i blocchi li puoi annidare per isolare degli oggetti temporanei che vuoi distrugere prima che termini la funzione.

Cioè:

void my_func()
{
String my_string("prima stringa");

{ // apro nuovo blocco
     // qui faccio operazioni gravose per la ram e dopo questo blocco la ram la uso ancora tanto
     // ma non è un problema perchè appena termina questo blocco tutta la ram che ho usato 
     // qui dentro viene pulita e torna nuovamente disponibile
     String my_string("una stringa lunga lunga");
     // Nota che questa è locale è sarà distrutta terminato il blocco
}

}

Ciao.

Grazie Mauro, chiaro il concetto, ma ora 2 domande ancora

  1. La string la ricomparo nel prossimo loop e quindi mi torna a servire in modo ciclico (piu che string è una variabile) ho usato la string perche altrimenti non riesco a calcolarla con i dati che mi vengono restituiti dal DS1307.

  2. come faccio a chiamare la funzione dal loop?

:wink:

  1. la soluzione più semplice senza passare da new e simili è usando una variabile globale.

  2. come una normale funzione

La chiami così

/nel loop 
my_func(dati che passi alla funzione );
/dove my_func é la tua funzione

Ciao Niko