Pregunta:
El tamaño de Arduino de los objetos de matriz Servo es ... ¿incorrecto?
briosheje
2014-05-07 04:29:24 UTC
view on stackexchange narkive permalink

Después de buscar durante bastante tiempo en Internet, no tengo más remedio que intentar preguntarle a alguien si puede explicarme esta situación aparentemente extraña.

Estoy haciendo algunas pruebas usando algunos servomotores, tratando de moverlos casi juntos usando el objeto millis () y Servo .

Está, por supuesto, funcionando ya sea para servos individuales o múltiples.

El caso, más detallado, trata sobre esto:

  1. Mueva uno, dos o más servomotores juntos.
  2. Obligarlos a tomar CASI el mismo tiempo para realizar cualquier acción.
  3. Tener un número dinámico de servos.

Acerca de los dos primeros puntos no tuve problemas para resolverlos, pude fácilmente hacer una función y luego hacer una biblioteca para realizar ese trabajo.

Sin embargo, como NO estoy tan acostumbrado a C ++ y me preguntaba si realmente era posible cree una matriz de objetos Servo, como realmente puede hacer, en arduino, con cadenas:

  String stringArray [] = {"string 1 "," string2 "," y así sucesivamente, me encanta. "};  

Entonces, después de preguntarme un rato, probé esto:

  Servo servObject; Servo servObject_2; Servo servObject_3; Servo servos [] = {servObject, servObject_2, servObject_3};  

¿Y sabes qué es genial? mi función está funcionando correctamente al forzar la cantidad de elementos de la matriz de servos.

Lo que quiero decir con eso es que si fuerzo a mi función a saber que va a tener 3 elementos en la matriz, funcionará, por supuesto; Sin embargo, por alguna razón, si uso sizeof (servos); el valor devuelto, sorprendentemente, es 2 .... Además, si solo empujo dos objetos servo en su lugar de tres en la matriz de servos, su sizeof devuelve 6 .

Al buscar en Google, descubrí un par de discusiones sobre el hecho de que, por algunas razones, en algunos casos, sizeof devuelve un valor incorrecto (si no me equivoco, era el valor correcto -1), pero en mi caso, aparentemente no sigue ninguna lógica.

La placa que estoy usando es una Arduino nano con ATMEGA 328.

Alguna idea de por qué no regresa el valor correcto? ¿Realmente me estoy equivocando totalmente porque no debería hacer una matriz de objetos servo?

pd: no publiqué el código completo porque hubiera sido inútil, ya que sizeof es la primera función llamado en el loop()

Regards,

briosheje

Lo que describe es extraño; ¿Podría publicar el código exacto que calcula el tamaño de la matriz y lo muestra (supongo que esto es a través de Serial)?
@jfpoilpret: arduino admite la construcción estándar `sizeof` disponible para cualquier objeto de matriz. Por lo tanto, cualquier arreglo (ej. Int elementos [] = {2,3,1,3,9};) genera su valor correcto (en el caso anterior 5) y obtengo el valor directamente del puerto serial. En cualquier caso, esta noche subiré el código completo, no estoy en casa y no puedo pegarlo desde mi Nexus 5: P
Sería útil publicar una versión de su código reducida al mínimo necesario para demostrar las devoluciones erróneas.
@JRobert: Esta noche publicaré el código completo, aunque, como dije anteriormente, la matriz se declara (y se llena) justo antes de la configuración e incluso si imprimo el `sizeof` al comienzo de mi ciclo, todavía genera el mismo valor que en la función donde lo estoy usando. Además, ¿hay alguna alternativa para verificar si existe un elemento de matriz? Si es posible, entonces podría hacer mi propio prototipo "sizeof".
Mi punto fue que es más fácil para alguien probar un programa simple o trivial que muestre el error que probar su programa completo, probablemente dependiente del hardware. Para responder a su pregunta, utilizo esta macro `#define countof (a) (sizeof (a) / sizeof (a [0]))` para encontrar el # de elementos en una matriz, pero como depende de `sizeof () No te será de mucha ayuda.
One responder:
#1
+7
jfpoilpret
2014-05-07 23:58:03 UTC
view on stackexchange narkive permalink

Lo que describe parece ser un problema común que muchos desarrolladores de C o C ++ pueden obtener (o tienen) con sizeof.

Eche un vistazo al siguiente código:

  char a [3]; int size (char b []) {return sizeof b;} void setup () {int size1 = sizeof a; int size2 = size (a);}  

En ese código, el compilador evaluará size1 en 3 que es el tamaño real de una variable, mientras que size2 será 2.

¿Por qué?

Esto es solo porque el compilador evalúa sizeof a , y el compilador sabe que a es una matriz de 3 char ; pero cuando se pasa a como argumento a la función size () , se convierte en un puntero (al primer elemento de la matriz), por lo que su tamaño es tamaño de un puntero , que es 2 bytes en AVR ATmega MCU.

Esta sutileza de sizeof puede explicar valores extraños como usted describe.

¿Cómo solucionar el problema?

La mayoría de las funciones de C que toman una matriz como argumento requerirán otro argumento que indique el tamaño de la matriz; esa es la forma (la única que creo) de lidiar con este problema.

Aquí hay un código de muestra:

  Servo allServos [] = {...}; #define NUM_SERVOS (sizeof (allServos) / sizeof (Servo)) ... void handleServos (Servo * servos, int numServos) {for (int i = 0; i < numServos; i ++) {servos [i] .write (. ..); ...}} void loop () {handleServos (allServos, NUM_SERVOS);}  

Es una práctica común en C declarar una matriz e inmediatamente después, define su tamaño como se indica arriba.

Oh, gracias, no sabía que sizeof, en ese caso, se habría referido al puntero del Array. Entonces, ¿hay alguna forma de obtener el tamaño real de la matriz anterior de objetos Servo? ¿Se supone que debo contar cada elemento y usar un contador?
@briosheje vea la última edición de mi respuesta.
¡Gracias! ¡Funciona! :) Ya he confirmado la respuesta como solución, pero aún así, ¡gracias por la explicación clara!


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...