Creacion de Cadenas

Saludos a todos. Soy nueva en la programacion en C asi que hay cosas que me cuesta algo entender. Tengo un código:

const char ssid[][33] PROGMEM = {

"Uno",
"Dos",
"Tres",
"Cuatro",
"Cinco",
"Seis",
"Siete",
"Ocho",
"Nueve",
"Diez",
"Once",
"Doce",
"Trece",
"Catorce",
"Quince"

};

Me gustaria saber si es Array o List, ya que quisiera tomar una variable externa y cargarla en el lugar de digamos "Dos", pero no se por donde comenzar (ademas que creo que tendre que cambiar el const por var), ¿alguien me puede guiar un poco?. Gracias.

Una solucion sin usar PROGMEM

const String ssid[] = {
        "Uno    ",
        "Dos    ",
        "Tres   ",
        "Cuatro ",
        "Cinco  ",
        "Seis   ",
        "Siete  ",
        "Ocho   ",
        "Nueve  ",
        "Diez   ",
        "Once   ",
        "Doce   ",
        "Trece  ",
        "Catorce",
        "Quince "
};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Array de Strings");
  int longitud = sizeof(ssid)/sizeof(ssid[0]);
  Serial.println("Longitud " + String(longitud));
  for(int i=0; i<longitud; i++) {
    Serial.printf("%s\n", ssid[i]);
  }
}

void loop() {
  
}

1 Like

Es un array.

PROGMEM hace que se guarde solamente en la memoria flash (o sea que no se vuelca a RAM al iniciar la ejecución), por eso se accede de una forma específica.

Entonces al estar en la flash no puedes modificar ningún valor.

Además está declarado const por lo que es de solo lectura.
En tu ejemplo no cambia nada porque está en flash pero si no lo estuviese

const char ssid[][33] = {

tampoco podrías alterar ningún valor porque el array almacena valores constantes.

Para que sea un array "normal" simplemente lo declaras

char ssid[][33] = {

y así si, modificas el valor que quieras.

Saludos

1 Like

Muchas gracias a ambos por sus respuestas.

Si entendi bien, entontes para modificar variables en tiempo se ejecucion, ¿debo de hacer algo asi?:

char ssid[1][33] = "Uno"
char ssid[2][33] = "Dos"
char ssid[3][33] = "Tres"
char ssid[4][33] = "Cuatro"
.
.
.
¿Estoy en lo correcto?

Y por ejemplo, para asignar una variable (dato) obtenido de digamos un sensor, debo de poner algo asi como:

char Dato1 = "Uno"

Y para meterlo en el array poner:

char ssid[1][33] = Dato1

¿Tambien estoy en lo correcto?

Una duda, en esta línea char ssid[1][33] = "Uno", ¿Porque hay un 33 entre llaves?.

Saludos y gracias, soy nueva en esto.

Porque el array ssid[1] tiene definida una longitud de 33 caracteres.
Y aunque "Uno" tiene 4 caracteres (porque se añade un caracter 0 como final de cadena) igual se ocuparán 33 bytes.

Te sugiero que googlees "arrays arduino" y/o "operaciones con arrays arduino" para profundizar en el tema.

1 Like

Muchas gracias @MaximoEsfuerzo , solo una duda, en lo demas (asignación de arrays y variables a array), ¿estoy bien o reprobe?

:wink:

1 Like

No

Esto no es una asignación de un valor, sino la creación de una nueva variable de tipo. Cada vez que el nombre de una variable va precedido de su tipo, se crea una nueva variable.

int x = 3;

Para asignar un valor a una variable ya existente, debe escribir así

x = 3;

Por lo tanto, estas lineas

char ssid[1][33] = "Uno";
char ssid[2][33] = "Dos";
char ssid[3][33] = "Tres";
char ssid[4][33] = "Cuatro";

no tratan de asignar valores a elementos de un array, sino de crear nuevas arrays bidimensionales. Dado que está intentando crear muchas arrays con el mismo nombre, el código generará un error al compilar

1 Like

Pero no dices nada del código que te propuse?
Tienes todo resuelto y vuelves a la carga con errores conceptuales.
Entiendo que tal vez esa sea la verdadera razón del post pero trabaja sobre algo que SI funciona.
Como te han dicho, PROGMEM es para almacenar datos y solo leerlos, no se pueden modificar. se guardan al momento de compilar y luego se usan en modo solo lectura.

Lo que te propuse ocupa memoria SRAM.
Si quieres hacerlo mas dinámico se pueden usar punteros pero no quise meterme ahi porque me pareció demasiado en este momento.

1 Like

Muchas gracias. Toda la razon, vengo de Basic, y alli seria como definir nuevamente una variable que ya se definio. Intente algo pero no me salio:

char ssidList [3] [33];
ssidList[0] = "Prueba1";
ssidList[1] = "Prueba2";

Pero me da error, "ssidList does not name a type"

Para explicarme, quiero hacer algo como en basic:

Dim ssidList as Array (es Array as String, pero dejemoslo asi para entendernos).
Dim Dato1, Dato2 as String

Dato1 = SensorX
Dato2 = SensorY

ssidList.Add(Dato1)
ssidList.Add(Dato2)

Si lei, el detalle es que estoy trabajando sobre un código ya armado y estoy queriendo hacer modificaciones. El código que lee es:

memcpy_P(&beaconPacket[38], &ssidList[i], 0x20);

Asi que tengo que adaptarme un poco a lo que hay. Saludos.

Moderador
Por favor, estas posteando códigos sin etiquetas, edita tus ultimos dos post usándolas.
Lee las normas.

Oky :white_check_mark:

Gracias.

Pues bueno, estudiando mucho el codigo que quiero modificar (mas a muchos topes en la cabeza por parte del entendimiento de Arduino), llegue a la conclusión de que @Surbyte tenia razon, char es para un byte (o una letra), lo que yo queria hacer era un String (en basic no habia habido tanta complicación con estas dos cosas).

Ciertamente trabajar sobre el String seria lo ideal, pero el programa sobre el que estoy trabajando ya tiene definido el leer un char (aunque no entiendo como en el programa dado usan un char con cadenas).

Creo que no podre usar los strings como quiero, ya que hay una funcion que al parecer hace uso de PROGMEM y del char (??), esta es memcpy_P.

Dice en la guia:

void * memcpy_P(void *, const void *, size_t)

Al ser el parametro una constante, veo un poco complicado el cambiarla.

Cada elemento de la matriz ssdList[] es, a su vez, también una matriz. El lenguaje C no permite asignar una matriz a otra.
Para asignar valores a elementos, use la función de copia de cadena strcpy()

char ssidList [3] [33];
strcpy(ssidList[0], "Prueba1");
strcpy(ssidList[1], "Prueba2");
1 Like

Muchas gracias, pero a la hora de compilar me salta un error:

Expected constructor, destructor or type conversion before '(' token.

2da vez que lo pido. No habrá 3ra.

Los posts anteriores los edite, mis ultimos no han usado código.

Moderador
Te envié privado @alexasthar para que entiendas como deben verse los posts con etiquetas.

Por favor, muestra su código completo