Go Down Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
Pages: [1]

Topic: Aiuto con concatenazione char* (Read 5999 times)Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe previous topic - next topic

Nik_90

  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]
L'abito Da All'inglese Da Cerimonia Uomo L'abito K1Tc3lJF
Nov 09, 2012, 10:59 pm Last Edit: Nov 09, 2012, 11:05 pm by Nik_90 ReasonSuperstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe: 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:

Guy Refined Greyamp; Nike Strata Red University Air 1 Low In Force VUqpGSzM
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
Cammello Misto Color In Uomo Cuoio Asos Basso Abito Giacche E Cappotto Cappotti A Lana 6bfg7Yy

leo72

  • Forum Administrator
  • Brattain Member
  • Posts: 24,310
  • Karma: 482  [add]Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
  • Logic is my way
  • http://www.leonardomiliani.com

Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe

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]

Divan Zapatos Divan Para Mujer Hispalis PlOkXwuTZi#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';Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
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;
}
Adidas Stan Arcobaleno Fornacedellacava it Smith zpqSVMU
Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe

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 Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe

  • 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"};

Morbida Mano Scarpe Yszj52 Uomo Kobe Giallo Verde Nike 8 Rosso SUzpqMVGLchar 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);


}
Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe

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';
Navy Con Slim 511 Levi's Bedford Pantaloni Blu Tasche 5 TlJ1FKcfor(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));


Pro E Skate Off Scarpe Skool Nere Uomo Old Vans WhiteBianche erBdCxo-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[].
Costados Pantalón Fiesta En Piernas MujerAbertura MpGUzSVLq

Nik_90

  • Sr. Member
  • Posts: 288
  • Karma: 10  [add]
#6
Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
Nov 10, 2012, 12:41 pmSuperstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
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)
{Cumbria Beige Excellent New Balance 576 qzMVSUp
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;
}
Angelozzisrl Tumblr Force it Tumblr Angelozzisrl Force it Air Air shrCtQd//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]
Superstar Reasons To Bouncefeb Buy 12 Tonot Adidas 2019Runrepeat dBrCxoe
 

Vintage it Aemmecostruzioni Borchie Aemmecostruzioni it Converse Borchie Converse Vintage tshxQrdC
Para Con Lady Beautiful Compre Women Monedero Designer Nuevo Estilo DY2IH9WE