Arduino y sus arrays

Todo cuanto tiene que ver con la obtención, almacenamiento y proceso de la información digital, sus aplicaciones y el software y hardware utilizado.
Responder
Mensaje
Autor
Avatar de Usuario
Rovellat
Mensajes: 9648
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Arduino y sus arrays

#1 Mensaje por Rovellat »

Evidentemente Arduino no maneja muy bién los arrays; ya es la segunda vez que choco con el tema.

Lo primero, que parece que no existe una función, que de directamente el nº de elementos del array.

Lo segundo, es que si pides un elemento del array, con el puntero fuera de rango; en vez de dar error; da otro elemento del array; lo cual despista mucho. (En mi caso, en un array de 6 elementos, al pedirle el 7, devolvía el 5; y tan pancho).

Al final he conseguido que funcionase; no tiene mucha importancia, pero hace perder tiempo. Os dejo lo que he hecho por si a alguien le interesa.

Se trata de una serie de diodos LED, con el cátodo a diversos pines, y los ánodos todos juntos, y a través de una sola resistencia al positivo; no tiene mucho interes, los diodos no pueden funcionar simultaneamente, pero me viene bién para probar un teclado touch que estoy haciendo.

Código: Seleccionar todo

/*
  Blink2
  Una modificación de Blink para que parpadeen varios diodos asociados a varias salidas de arduino
  Para mas información ver Blink.en arduino.cc
 */
int pinLed[] = {2, 3, 4, 5, 6, 7};  // Es un array que contiene los números de las salidas (pines conwectados a LEDs)
int elementos;  // Esta variable tendrá el nº de elementos (pines) del array

void setup() {
   elementos = sizeof(pinLed)/sizeof(pinLed[0]);    // Se supone que averigua el nº de elementos
   for (int n=0; n < elementos; n++)  // Barre el array; inicializa los pines
  {
    pinMode(pinLed[n], OUTPUT);  
    digitalWrite(pinLed[n], HIGH);
  }
}

void loop() {
  for (int n=0; n < elementos; n++)  // Barre todos los pines del array
  {
  digitalWrite(pinLed[n], LOW); // Enciende el LED n
  delay(1000); 
  digitalWrite(pinLed[n] , HIGH);  //Apaga el LED n
  delay(1000); 
  }
}
El programita lo que hace es probar el engendro.

Saludos.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Avatar de Usuario
heli
Mensajes: 1952
Registrado: Mié Sep 06, 2006 7:28 am
País: España
Ciudad: Alcalá de Henares
Ubicación: Alcala de Henares (Madrid, España)
Contactar:

Re: Arduino y sus arrays

#2 Mensaje por heli »

Eso no es un problema de Arduino, es unacaracterística del Cy C++.
Es responsabilidad del programador controlar el tamaño y número de elementos de los arrays, es el programador el que los declara o los alocata con alloc/malloc. Existe la función sizeof() que da la el tamaño en bytes de una variable o array, pero solo en tiempo de compilación. No funcionara para alocatación dinámica con malloc.
En micros con gestor de memoria, arm etc, referirse a un elemento del array inexistente puede dar fallo de memoria o un dato raro.

El C es asi, para bien o para mal, cuando se conoce bien y se programacon cuidado es genial y muy potente.

Si el índice de los arrays no esta acotado, en un bucle o asi, y depende de valores externos o datos el usuario te recomiendo que SIEMPRE controles los límites para evitar el famoso problema del "puntero loco" de C.
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es

Avatar de Usuario
Rovellat
Mensajes: 9648
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: Arduino y sus arrays

#3 Mensaje por Rovellat »

Pues que queres que te diga Heli, es una gaita; máxime cuando no veo ningún problema en que el software te diga el nº de elementos, tanto en compilación como dinamicamente, siempre que no te pases del máximo declarado.

Cierra muchas puertas, y obliga a mucho código extra.

La cláve mágica sizeof(pinLed)/sizeof(pinLed[0]), me parece una chapuza, cuando un simple len(pinLed) debería ser suficiente, y devolver los elementos, no los bytes. Asi se las apaña de bien con las cadenas.

Saludos.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Avatar de Usuario
heli
Mensajes: 1952
Registrado: Mié Sep 06, 2006 7:28 am
País: España
Ciudad: Alcalá de Henares
Ubicación: Alcala de Henares (Madrid, España)
Contactar:

Re: Arduino y sus arrays

#4 Mensaje por heli »

En java existe esa función, pero en java las variables son siempre dinámicas:
float variable[] = {1.2, 3.4};
numerodevariables = variable.length;

En C, que es lo mas parecido a assambler que vas a encontrar (quitando el extinto pl/m) y eso significa que todo lo controlas tu mismo.
No tiene sentido querer saber la longitud de un array cuando eres tu mismo el que la ha definido. En C los arrays son estáticos y tienes que declararlos con un determinado tamaño.

A mi me gusta declarar siempre los arrays definiendo su tamaño y usar siempre la definición de tamaño para manejarlos:

#define MAXCHANNELS 6
float Zero[MAXCHANNELS] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
float Span[MAXCHANNELS] = {15.0, 15.0, 15.0, 15.0, 15.0, 15.0};
for (init i=0; i<MAXCHANNELS; i++)
{
if (Zero == Span) HaceAlgo();
}

if (Index >0 && Index<MAXCHANNELS) Zero[index] = Algo;
else IdexFueraDeRango();

Además el compilador te avisará si declaras el array de un tamaño y lo inicializas con el número incorrecto de elementos.
¡No es imposible, lo que pasa es que no sabes como hacerlo!
Aka: no es difícil si sabes como.
http://heli.xbot.es

Avatar de Usuario
Rovellat
Mensajes: 9648
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: Arduino y sus arrays

#5 Mensaje por Rovellat »

Bueno Heli, te hago caso; pero en el fondo me fastidia no poder olvidarme de la rutina, y estar ligado al nombre de la definición, que no puedo cambiar sin cambiar la rutina; raro que es uno.

¿Por cierto, sabes si tiene ensamblado condicional?.

Saludos.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados