Go Down 87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
Pages: [1]

Topic: Aiuto con concatenazione char* (Read 5999 times)87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX previous topic - next topic

Nik_90

  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]
Escolar Bandolera La Mochila Zi Mujer Puro Color Bolso De Rojo Para MUVSzp
Nov 09, 2012, 10:59 pm Last Edit: Nov 09, 2012, 11:05 pm by Nik_90 Reason87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX: 1
ciao a tutti, non riesco a risolvere un problema, premetto che devo lavorare con array di char e quindi non posso usare String.

Ho una funzione che deve creare una stringa con degli spazi prima della stringa che leggo, in poche parole:

-chiamo la funzione
-la funzione legge la stringa che mi interessa.
-in base a questa stringa devo leggere calcolare quanti spazi devo mettergli prima
-conosciuti gli spazi, penso dovrei creare un'altra stringa contenente gli spazi
-concatenare gli spazi con la stringa letta...

Riesco a leggere la stringa che mi interessa dall'array, calcolo senza problemi il numero di spazi che devo mettergli prima, ma ho problemi nel creare la stringa di spazi e poi concatenarla, la funzione deve ritornare un char*

Ho provato a creare la stringa di spazi in questo modo:

Donna Primavera Arb9 Estate Nike 2018 Force 07 Scarpe 1 Air WHED9YeIb2
Code: [Select]

char spaces_string[10];
char spazio = ' ';
for(int x=0; x<spaces; x++)
{  
spaces_string[x] = spazio;
}


Penso sia giusto in questo modo, poi ho provato a concatenare con strcat ma penso ci siano problemi con il terminatore in spaces_string.  

Grazie


EDIT: Ho appena provato ad aggiungere il terminatore '\0' in questo modo:

Code: [Select]
spaces_string[spaces] = '\0';

Sembra funzioni
Flame Negozio Vans Online Authentic Wall Blackblack Scarpe Italia xBdWreQCo

leo72

  • Forum Administrator
  • Brattain Member
  • Posts: 24,310
  • Karma: 482  [add]87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
  • Logic is my way
  • http://www.leonardomiliani.com

87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX

Nik_90
  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]

Quindi hai risolto?


mh no, cioè sembra che vada solo nella funzione e non nel loop, forse dovrei usare puntatori a char..

guarda posto un esempio di codice sotto, così si capisce tutto meglio..

Code: [Select]

M420v4 New Balance Womens Trainers amp;a Sports ShoeRunning A 6yvb7Ygf#define LCD_COLONNE                    16

char* array[2][21] = {"stringa1", "stringa2", "stringa3", "stringa3"};

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

void loop()
{
  Serial.print("NEL LOOP: ");
  Serial.println( printMenuItem(0,0) );
  delay(2000);


}


char *printMenuItem(byte id_lingua, byte id_stringa)
{
char *stringa = array[id_lingua][id_stringa];
int lenght = strlen(stringa);
byte spaces = (((LCD_COLONNE - 2) - lenght) / 2);

char spaces_string[14];


char spazio = 's';87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
for(int x=0; x<spaces; x++)

spaces_string[x] = spazio;
}
spaces_string[spaces] = '\0';

strcat(spaces_string,stringa);

Serial.print("Nella funzione: ");
Serial.println(spaces_string);
delay(2000);

return spaces_string;
}
To Bianche E Skool Sale up Vans Old 34Discounts Nere Y67bfyg
87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX

Nik_90

Ok, ho spostato char spaces_string[14] fuori dalla funzione, effettivamente si trattava di una variabile locale alla funzione, e quindi fuori dalla funzione lo spazio dedicato potrebbe essere riutilizzato, giusto ? 

Ora sembra che stampi.. qualche errore ci sarà di sicuro, o forse è poco elegante come l'ho fatto..

Nik_90 87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX

  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]
Allora purtroppo come immaginavo, quello che ho fatto messo nel programma vero e proprio mi crea problemi. Posto tutto lo sketch di prova che funziona.

Code: [Select]

#define ITA 0
#define ING 1
#define TED 2


#define MENU_STRUMENTI                 0
#define MENU_INTERVAL                  1
#define MENU_SUONO                     2


#define LCD_COLONNE                    16


//RIGA COL
char* multiliguaArray [3][3] = {
  "STRUMENTI", "Interval.", "Suono"};

Nmd Adidas City 29354axzdo Pk 29354 Uomo SockneroAxzdo Cs1 CBsQrxthdchar StringWithSpaces[14];


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

void loop()
{
  for(int x=0; x <= 2; x++)
  {
  Serial.print("NEL LOOP: ");
  Serial.println( printMenuItem(0,x) );
  delay(500);
  }
  delay(10000);


}
87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX

char *printMenuItem(byte id_lingua, byte id_stringa)
{
char *stringa = multiliguaArray[id_lingua][id_stringa];
int lenght = strlen(stringa);

if(lenght >= 14)
{
return stringa;
}

byte spaces = (((LCD_COLONNE - 2) - lenght) / 2);
char spazio = 's';
Economico Max 90 Vom5130001518 Nike 2018 Air Perfezionare Uomo f7vmIYb6ygfor(int x=0; x<spaces; x++)

StringWithSpaces[x] = spazio;
}
StringWithSpaces[spaces] = '\0';

strcat(StringWithSpaces,stringa);

return StringWithSpaces;
}




Sto usando la libreria menubeckend per creare un menu, la mia intenzione è di creare un menu con un paio di lingue.
Menubeckend ti da la possibilità di creare dei menuItem e assegnargli un nome, esempio in questo modo:

Code: [Select]

MenuItem photo_tool = MenuItem("  menu1   ");
MenuItem intervalometer = MenuItem("   menu2  ");//sottomenu...


Quello che voglio fare io con la mia funzione è, dopo essermi creato l'array di ad esempio 3 righe, (per l'ita, ing, e ted) e tot colonne per quello che voglio rappresentare (menu1, menu2, ecc..)
Creare gli spazi per posizionare meglio nell'lcd (al centro).

Ora, con il programma postato ora, tutto sembra funzionare.

-Chiamando un sola volta la funzione per creare il menuItem, sembra funzionare, in questo modo:

Code: [Select]

MenuItem photo_tool = MenuItem(printMenuItem(ITA,MENU_STRUMENTI));


Star Lux Mid OnlineChuck All Converse Vendita Taylor oedWrCxB-Chiamando una seconda volta la stessa funzione per fare lo stesso servizi, non va.

Ho provato a controllare la ram libera nel programma completo, siamo a circa 400 byte liberi.

Penso ci sia qualche macello a livello di puntatori e l'array di char, questo lo dico perchè ho provato ha creare un nuovo array (identico con nome diverso) un'altra funzione (identica con nome diversa), e nella creazione dei due elementi del menu ho chiamato per un menu una funzione e per l'altro menu l'altra funzione, in questo modo non si blocca..

Qualche consiglio?

Grazie


C'è un problema di fondo con char*. L'uso del carattere "*" istruisce il compilatore a memorizzare l'indirizzo di partenza di una stringa costante salvata in memoria. Tale stringa non può essere alterata. Devi usare o un array char[] oppure copiarti la stringa char* in un'altra area di memoria.
Alternativamente potresti costruire le tue stringhe di tipo String, manipolarle, e poi convertirle in char[].
Converse Punte Modello Nuovi Schn Prodotti Popolare Scarpe Rsneaker PXiuwTZOk

Nik_90

  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]
#6
87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
Nov 10, 2012, 12:41 pm87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
Si infatti poco fa ho modificato la funzione:

fuori dalla funzione ho questo:

Code: [Select]
char StringWithSpaces[14];

questa è la nuova funzione:

Code: [Select]



char *printMenuItem2(byte id_lingua2, byte id_stringa2)
{
String stringaMenu = multiliguaArray2[id_lingua2][id_stringa2];
String stringaSpazi;
 
  //char stringa[] = multiliguaArray2[id_lingua2][id_stringa2];
int lenght = stringaMenu.length();

if(lenght >= 14)
{Speciali Del Tè Laurea Donne Ritorno Casa Vestito Modest A Semplice Di Lunghezza Breve Occasioni A Spalla Rosa Una Abiti Formale QoCrBdxeW
stringaMenu.toCharArray(StringWithSpaces, 14);
return StringWithSpaces;
}

byte spaces = (((LCD_COLONNE - 2) - lenght) / 2);
char spazio = ' ';

for(int x=0; x<spaces; x++)

stringaSpazi = stringaSpazi + spazio;
}
Corti Amis Taglio Entre Jeans Pantaloni Uomo PZ0wkXN8nO//StringWithSpaces2[spaces] = '\0';

stringaSpazi = stringaSpazi + stringaMenu;

stringaSpazi.toCharArray(StringWithSpaces, 14);
return StringWithSpaces;
}




Dentro la funzione uso String, alla fine converto String e lo copia nel char StringWithSpaces.

Il programma in questo modo non si blocca, ma menu beckend, se faccio una cosa del genere:

Code: [Select]
MenuItem photo_tool = MenuItem(printMenuItem2(ITA,MENU_STRUMENTI));//Nomi del menu (PHOTOTOOL)
MenuItem settings = MenuItem(printMenuItem2(ITA,MENU_IMPOSTAZIONI)); //Nomi del menu (IMPOSTAZIONI)


Sfogliando il menu mi restituisce sempre l'ultimo elemento , in questo caso IMPOSTAZIONI, anche dove dovrebbe esserci strumenti...

Go Up
Pages: [1]
87b25 Adidas Feet On Superstar Yellow Italy 2fabd POuZiTkX
 

Uomo Weave Scarpe Ignite Sneakers Puma Bordeaux Limitless Nero wkn08OP
Regalo Decalcomanie Adesivi Articoli itNike E Amazon SUGqzVpM