[programmazione] Come si passa un dato String?

Scusate la domanda stupida. Come si passa un dato String?

Perché se lo passo così:

String mia_stringa;
funzione(mia_stringa);

void funzione(String seconda_stringa) {
  int a=seconda_stringa.length();
}

a contiene 1. In pratica mi passa solo il 1° carattere....

strano, in toria cos' stai passando una copia dell'oggetto stringa, quindi di tutto il suo contenuto.

Ciao Leo, non concosco la classe string, comunque in genere gli oggetti si passano per riferimento o passi un puntatore al tipo stringa.

a contiene 1. In pratica mi passa solo il 1° carattere....

Ma io vedo solo la creazione di un'oggetto mia_stringa di tipo String, non vedo assegnamenti, non so se è possibile creare istanza così String mia_stringa("costante letterale"). Comunque anche se non vedo assegnamenti se ti aspetti una lunghezza magiore di uno è perchè hai fatto assegnamento ma non si vede nel codice.

Guarda la creazione String mia_stringa e identica a String seconda_stringa, quindi stai creando una nuova istanza seconda_stringa di tipo String, e la lunghezza non è zero probabilmente a causa del marcatore fine stringa "\0".

Prova un pò così:

String mia_stringa("this is mia_stringa");
mia_funzione(mia_stringa);

void mia_funzione(String &seconda_Stringa);
{
    .....

Oppure dichiari un variabile puntatore a tipo String, String *ptr_string;
e poi assegni ptr_string = &mia_stringa;

Ciao.

Corretto, mia_funzione(&mia_stringa), così passi un puntatore e devi dichiarare il prototipo :
void mia_funzione(String *str);

Ariciao.

ma hai proprio la necessita di usare il tipo String? non puoi usare un array di char che finisce con null?

tempo fà scrissi un riassuntino rapido in italiano per String, lo trovi qui:

non sò se può esserti di aiuto. spero di si :slight_smile:
ciao

@Mauro:
se passo un riferimento ed uso un puntatore il compilatore non mi fa usare le conversioni tra tipi. L'esempio che ho messo è stringato, non è quello che sto facendo. Io passo una stringa letta dalla seriale ad una funzione che mi deve elaborare i dati letti. Nella funzione dovrei estrarre dal 2° carattere della stringa in poi ma se passo appunto un riferimento mi da errore usando il metodo .toCharArray dell'oggetto stringa dicendo che non può convertire fra tipi. Passando la stringa in quel modo pensavo che fosse come in Gambas, ossia passavo la variabile per valore, ma così non è....

@Brain:
ho letto, ma non trovo risposta alla mia domanda :smiley:

@lesto:
sto usando il tipo String perché non so a priori quanti caratteri mi arriveranno sulla seriale per cui l'oggetto String, essendo dinamico, faceva al caso mio.

Mi sa che dovrò convertire prima in char* e poi passare questo per riferimento alla funzione.

dunque, il passaggio come puntatore(riferimento) sicuramente non deve dare problemi, se hai errori è perchè hai sbagliato qualcosa usando valori o riferimenti.

posta come stai facendo che risolviamo al volo.

Per quanto riguarda il passaggio del vero e proprio oggetto stringa per valore, e non per riferimento, il problema è un poco arduo. Non avendo mai usato il C++ (e java passa sempre e solo per riferimento) non so quale funzione di costruttore viene usata per il passaggio. Credo venga usato:

String::String( const String &value )
{
  getBuffer( _length = value._length );
  if ( _buffer != NULL )
    strcpy( _buffer, value._buffer );
}

prova a metterci dentro una prinltn(); per vedere se effettivamente è così (si tratta della classe WString.cpp), però potrebbe anche essere usata la

const String & String::operator=( const String &rhs )

o magari un'altro metodo non implementato. ho fatto una veloce ricerca ma le guide in c++ che ho trovato non erano così avanzate, dedicandoci un pò di tempo dovresti trovare qualcosa al riguardo

leo72:
Scusate la domanda stupida. Come si passa un dato String?

Perché se lo passo così:

String mia_stringa;

funzione(mia_stringa);

void funzione(String seconda_stringa) {
  int a=seconda_stringa.length();
}




a contiene 1. In pratica mi passa solo il 1° carattere....

mi pare ovvio da questo esempio: non hai messo niente nella stringa quindi hai un crattere 1n e basta :smiley:

String* mia_stringa;
funzione(mia_stringa);

void funzione(String seconda_stringa) {
  int a=seconda_stringa.length();
}

poi mi pare più comodo così

Mi devo leggere qualcosa di C++, perchè dimentico i particolari.
Ora se non prendo un'abbaglio, per passare un'ogetto per valore come si fà con i tipi predefiniti, il tipo o classe devi definire un costruttore di copia, anche se ricordo che se no lo si fà C++ ne fornisce uno predefinito.

Negli esempi delle Qt, il tipo QString viene passato alle funzioni per riferimento costante, cioè così:
//prototipo
void func(const QString&)

void func(const QString &fileName)
{
......

Tuttavia Qt usa in molte classi un sistema chiamato implicit shared nelle sue classi, questo garantisce velocità e sicurezza, mentre i C++ puro la cosa più rapida è passare un puntatore e anche questo può essere costante, puoi ancora modificare l'oggetto ma non puoi modifcare il puntatore.

Ciao.

Raga, il codice postato era di esempio, è ovvio che la stringa contenga qualcosa XD
Ora non sono al PC dove ho il codice completo, domani ve lo posto.

Cosi funziona:

String mia_stringa;

void setup(){
  Serial.begin(115200);
}

void loop(){  
  String mia_stringa="pippo";
  funzione(mia_stringa);
  delay(1000);
}


void funzione(String seconda_stringa) {
  int a=seconda_stringa.length();
  Serial.println(a);
  Serial.println(seconda_stringa);
}

sicuro non ti manchi il caratteri di fine '\0' nella stringa?

Come detto, non sono al PC con il codice però se a te funziona (ed il codice è uguale a quello che uso io, per lo meno nei passaggi principali), allora mi viene da pensare che il problema sia a monte e che l'algoritmo di acquisizione caratteri dala seriale abbia qualcosa che non va e che mi legga solo 1 carattere.... Domani lo ricontrollo...

Si con quello che ti ho postato mi invia:

5
pippo
5
pippo
5
pippo
5
pippo

quindi si prob hai qualche errore