Cientificosaficionados.com

Los foros de los científicos aficionados de la red.
Fecha actual Lun Sep 21, 2020 2:01 am

Todos los horarios son UTC [ DST ]




Nuevo tema Responder al tema  [ 5 mensajes ] 
Autor Mensaje
NotaPublicado: Vie Mar 10, 2017 4:45 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6993
Ubicación: Palma de Mallorca (España)
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:
/*
  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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
NotaPublicado: Vie Mar 10, 2017 5:30 pm 
Desconectado
Avatar de Usuario

Registrado: Mié Sep 06, 2006 7:28 am
Mensajes: 1470
Ubicación: Alcala de Henares (Madrid, España)
País: España
Ciudad: Alcalá de Henares
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


Arriba
 Perfil  
 
NotaPublicado: Vie Mar 10, 2017 5:43 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6993
Ubicación: Palma de Mallorca (España)
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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
NotaPublicado: Vie Mar 10, 2017 11:45 pm 
Desconectado
Avatar de Usuario

Registrado: Mié Sep 06, 2006 7:28 am
Mensajes: 1470
Ubicación: Alcala de Henares (Madrid, España)
País: España
Ciudad: Alcalá de Henares
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[i] == Span[i]) 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


Arriba
 Perfil  
 
NotaPublicado: Dom Mar 12, 2017 4:50 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6993
Ubicación: Palma de Mallorca (España)
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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 5 mensajes ] 

Todos los horarios son UTC [ DST ]


¿Quién está conectado?

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


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com