Go Down

Topic: Allocare dinamicamente un vettore di stringhe (Read 1 time) previous topic - next topic

mikecurl91

Salve,
nel mio sketch ho la necessità di leggere da uno specifico file sulla scheda SD delle stringhe scritte una per riga.
Ovviamente non ho alcun problema a estrapolare le stringhe dalla scheda, ma dovrei poi, in base al numero di stringhe estratte, riempire dinamicamente un vettore fino ad ottenere un vettore come quello mostrato qui sotto
char* stringhe_estratte[] = {"0011324862","0013530444","0011308547","0006105341"};

Purtroppo non posso utilizzare l'oggetto String per altri motivi legati alla memoria...

Come posso procedere all'allocazione dinamica di memoria per riempire il vettore sopra mostratovi?

lesto

stai cercando la realloc, però non credo funzioni sugli array, devi trasformarlo in un puntatore, quindi il tuo stringhe_estratte non è più un array di puntatori a char, ma un puntatore a puntatori a char:

char** stringhe_estratte = {"0011324862","0013530444","0011308547","0006105341"};

se ti serve un elemento in più fai
Code: [Select]

int *temp = realloc(stringhe_estratte, sizeof(char*)*(numeroElementiDiStringhe_estratte+1));
if ( temp != NULL ) //realloc was successful
{
   stringhe_estratte= temp;
}
else //there was an error
{
   free(stringhe_estratte);
   Serial.println("Error allocating memory!");
}


dove
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

mikecurl91

Ciao lesto,
per prima cosa grazie della risposta...
non ho ben capito il codice da te postato: se ad esempio avessi un vettore di caratteri chiamato 'nuovo_estratto'  contenente la stringa estratta dal file nell SD, come dovrei inglobarlo nel codice da te postato, al fine di inserire 'nuovo_estratto' nella sequenza 'stringhe_estratte'?

lesto

#3
Sep 20, 2012, 02:09 pm Last Edit: Sep 20, 2012, 02:20 pm by lesto Reason: 1
Code: [Select]
char **temp = realloc(stringhe_estratte, sizeof(char*)*(numeroElementiDiStringheEstratte+1));
if ( temp != NULL ) //realloc was successful
{
  stringhe_estratte= temp;
  stringhe_estratte[numeroElementiDiStringheEstratte]=nuovo_estratto;
  numeroElementiDiStringheEstratte++;
}
else //there was an error with realloc
{
   Serial.println("Reallocating memory error! Falling back to malloc");
   temp = malloc(stringhe_estratte, sizeof(char*)*(numeroElementiDiStringheEstratte+1));

   if ( temp != NULL ) //realloc was successful
   {
      for (int i=0;i < numeroElementiDiStringheEstratte;i++){
          temp[i] = stringhe_estratte[i];
      }
      char **temp2 = stringhe_estratte;
      stringhe_estratte= temp;
      free(temp2);
      stringhe_estratte[numeroElementiDiStringheEstratte]=nuovo_estratto;
      numeroElementiDiStringheEstratte++;
   }
   else //there was an error with realloc
   {
      Serial.println("Error allocating memory! Aho, nun c'è sta proprio abbastanza spazio");
   }
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

cyberhs

Ho notato che le stringhe sono tutte numeriche.

Se ha problemi di spazio, non ti converrebbe trattarle come numeri interi?

Ettore Massimo Albani

mikecurl91

Purtroppo dovrò trattare analogamente anche un vettore di caratteri alfabetici...

Go Up