Go Down

Topic: Aiuto con concatenazione char* (Read 1 time) previous topic - next topic

Nik_90

Nov 09, 2012, 10:59 pm Last Edit: Nov 09, 2012, 11:05 pm by Nik_90 Reason: 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:

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.  :smiley-roll-blue:

Grazie


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

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

Sembra funzioni :)

leo72


Nik_90


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]

#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';
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;
}

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 ?  :smiley-roll-blue:

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

Nik_90

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

char 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);


}


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';
for(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));


-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


Go Up