Tipo para cada valor y nombres, estructuras anónimas internas de estructura -- ampo con formatting camp codereview Relacionados El problema

Type for each value and naming, anonymous structs inside struct


4
vote

problema

Español

Aquí hay un pequeño fragmento de mi types.h Código:

  /**  * tick_t: is used to store and manipulate with time (tick count)  * Unsigned, at least 32bits  * 32bit number gives us 71 minutes resolution  * 64bit number gives us 584'942 years resolution  * Use OMFW_TIME_ISELAPSED(targetTime, currentTime) for time comparing  */ typedef unsigned long tick_t;  /**  * pos_t: Signed integer which holds position  * In most cases even 16bit number is enough  */ typedef int pos_t;  /**  * num_t: Floating point number used to calculate   * Please note, if you want use fixed point or any custom  * number, you should use operator overoading feature of C++  * and also implement following functions for it in omfw/math.h  */ typedef double num_t;  /**  * step_t: Hold current step value  * Only increased / decreased by one  * May be signed, unsigned, floating point  */ #ifdef OMFW_PRECOMPUTE_TABLE typedef uint32_t step_t; #else typedef num_t step_t; #endif   

y aquí la definición de estructura en un archivo diferente:

  typedef struct {     num_t acceleration;     num_t speed;     num_t pulseLength;      int id; //index 0,1,2...     int32_t letter; //unicode letter      /** total resolution = motor resolution * gearbox */     pos_t motorResolution;     num_t gearbox;      int pinSignal;     int pinDirection;     bool invertSignal;     bool invertDirection; } MotorSettings;  typedef struct {      /** Motor settings */     MotorSettings set;      /** Maximum achievable limits       * Computed from "in" variables */     struct {         num_t speed; //v-max; max steps/sec         num_t acceleration; //a-max; Max accceleration that can be used     } max;      /** Position data stored here */     struct {         pos_t resolution;         pos_t curPosition;         pos_t tarPosition;          //TODO impl - when motor lose step, increment this         pos_t curOffset;          dir_t curDirection;         dir_t tarDirection;     } pos;      /** Calculated and changed by program       * Used as indications to calculate realtime data */     struct {         num_t speed; //v = steps/sec         num_t acceleration; //a = steps/sec.sec     } cur;      /** Used for Realtime caclulations and timing      * Should not be used in other parts of program than realtime */     struct {         //tick count to turn off and next tick         //cannot overflow         tick_t timeTurnOff;         tick_t timeNextMove;          num_t firstDelay; //c0; depending on TIME_RESOLUTION         num_t minimalDelay; //clast; TIME_RESOLUTION / maxSpeed          step_t stepsToAccelerate; //nmax         step_t currentStep; //n     } rt;  } Motor;   

Estoy haciendo un pequeño proyecto que me gustaría publicar pronto, pero tengo pocas preguntas sobre nombrar:

  • está teniendo múltiples tipos para cada valor OK, ¿los tengo? Espero que sí, intenté mantenerlo tan simple como lo supe, pero estamos discutiendo con un amigo acerca de eso, cree que deberíamos agregar 9988777665544333 prefijo y hacerlos más generales (por ejemplo, hacer <. Código> tick_t solo 64bits), pero quiero que este código se ejecute rápidamente en los microcontroladores de 16 bits y que el tiempo de 32 bits esté funcionando bien.
  • ¿Tienen el nombramiento correcto? Añadido _t prefijo como uintx_t tiene.
  • ¿Está bien tener múltiples estructuras anónimas dentro de la estructura principal? Hay muchos datos aquí y quiero organizarlos. ¿Debo declarar que las estructuras normales, incluso cuando no quiero serializarlas ni acceder como únicas (excepto los motores)?
  • ¿Las estructuras y las variables en ellos tienen nombres correctos?
  • y el último. No soy un hablante de inglés nativo, por lo que si hay errores en el texto o el código, agradecería que me avisas. Gracias
Original en ingles

Here is little snippet from my types.h code:

/**  * tick_t: is used to store and manipulate with time (tick count)  * Unsigned, at least 32bits  * 32bit number gives us 71 minutes resolution  * 64bit number gives us 584'942 years resolution  * Use OMFW_TIME_ISELAPSED(targetTime, currentTime) for time comparing  */ typedef unsigned long tick_t;  /**  * pos_t: Signed integer which holds position  * In most cases even 16bit number is enough  */ typedef int pos_t;  /**  * num_t: Floating point number used to calculate   * Please note, if you want use fixed point or any custom  * number, you should use operator overoading feature of C++  * and also implement following functions for it in omfw/math.h  */ typedef double num_t;  /**  * step_t: Hold current step value  * Only increased / decreased by one  * May be signed, unsigned, floating point  */ #ifdef OMFW_PRECOMPUTE_TABLE typedef uint32_t step_t; #else typedef num_t step_t; #endif 

and here definition of struct in different file:

typedef struct {     num_t acceleration;     num_t speed;     num_t pulseLength;      int id; //index 0,1,2...     int32_t letter; //unicode letter      /** total resolution = motor resolution * gearbox */     pos_t motorResolution;     num_t gearbox;      int pinSignal;     int pinDirection;     bool invertSignal;     bool invertDirection; } MotorSettings;  typedef struct {      /** Motor settings */     MotorSettings set;      /** Maximum achievable limits       * Computed from "in" variables */     struct {         num_t speed; //v-max; max steps/sec         num_t acceleration; //a-max; Max accceleration that can be used     } max;      /** Position data stored here */     struct {         pos_t resolution;         pos_t curPosition;         pos_t tarPosition;          //TODO impl - when motor lose step, increment this         pos_t curOffset;          dir_t curDirection;         dir_t tarDirection;     } pos;      /** Calculated and changed by program       * Used as indications to calculate realtime data */     struct {         num_t speed; //v = steps/sec         num_t acceleration; //a = steps/sec.sec     } cur;      /** Used for Realtime caclulations and timing      * Should not be used in other parts of program than realtime */     struct {         //tick count to turn off and next tick         //cannot overflow         tick_t timeTurnOff;         tick_t timeNextMove;          num_t firstDelay; //c0; depending on TIME_RESOLUTION         num_t minimalDelay; //clast; TIME_RESOLUTION / maxSpeed          step_t stepsToAccelerate; //nmax         step_t currentStep; //n     } rt;  } Motor; 

I am doing one little project that I would like to publish soon, but I have few questions about naming:

  • Is having multiple types for each value OK in way I have them? I hope yes, I tried keep it as simple as I knew, but we are arguing with friend about that - he thinks that we should add omfw_ prefix to them and make them more general (eg. make tick_t just 64bits), but I want to make this code run fast on 16bit microcontrollers too and having 32bit timing is working good.
  • Do they have correct naming? I added _t prefix as uintx_t have.
  • Is it OK to have multiple anonymous structs inside main struct? There is lot of data in here and I want to organize them. Should I declare then as normal structs, even when I dont want to serialize them or access as single ones (except MotorSettings)?
  • Do the structs and variables in them have correct naming?
  • And last one. I am not native English speaker, so if there are any errors in text or code, I would appreciate if you let me know. Thanks
     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 
  .getElementsByClassName("abc")[0]1  

Estamos discutiendo con un amigo acerca de eso, cree que deberíamos hacer [...] Tick_T, solo 64bits [...], pero quiero que este código se ejecute rápidamente en los microcontroladores de 16 bits también

Personalmente, nunca usaría el .getElementsByClassName("abc")[0]2 .getElementsByClassName("abc")[0]3655443323 tipos en el código de producción, ya que varían en tamaño incluso entre las diferentes plataformas de 32 bits. En algunas plataformas, .getElementsByClassName("abc")[0]4 es 32 y .getElementsByClassName("abc")[0]5 99887766555443326 es 64; En otras plataformas, .getElementsByClassName("abc")[0]7 es 32 y .getElementsByClassName("abc")[0]8 .getElementsByClassName("abc")[0]76555443329 es 64. En lugar de jugar un juego de adivinanzas con los futuros requisitos de portabilidad de mi programa, Yo escribiría explícitamente

  .querySelector(".abc")0  

Esto es mucho más escribiendo, pero transmite la semántica prevista sin ambigüedad: es decir, por defecto Quiero 64-bit .querySelector(".abc")1 , pero también quiero dar el Constructor La opción de usar 32 bits .querySelector(".abc")2 en caso de que sea útil para él. De hecho, este permita que el constructor pase .querySelector(".abc")3 en su plataforma de 32 bits, o .querySelector(".abc")4 en su plataforma de 16 bits si realmente quiere.


¿Tienen el nombramiento correcto? Añadido .querySelector(".abc")5 Prefijo como .querySelector(".abc")6 tiene.

FYI, eso es un sufijo (adjunto), no un prefijo (prepende).

esto está bien; Pero usted está cortejando colisiones con la biblioteca estándar. Por ejemplo, la biblioteca estándar ya define .querySelector(".abc")8 y .querySelector(".abc")9 ; Si tiene la costumbre de usar los mismos convenciones de nombres exactas que la biblioteca estándar, puede que un día se encuentre en problemas cuando necesite un nombre para una entidad que representa un tipo de "tiempo" o un tipo "offset".

Por lo tanto, recomendaría al menos nombresPaciendo a los identificadores como getElementsByClassName0 , 99887766555443341 , etc. (también note que escribí "offset" en lugar de "apagado", porque Es más claro y el compilador ciertamente no le importará que estemos siendo un poco más verbosos.)


  getElementsByClassName2  

seguramente getElementsByClassName3 debe ser un getElementsByClassName4 . Además, en todos los casos en los que está utilizando getElementsByClassName5 , sugiero ser explícito sobre el rango esperado del valor: ¿es lo suficientemente bueno 998877776655443346? ¿Podríamos escapar con getElementsByClassName7 ? Definitivamente usaría un 99887766555443348 , pero aquí está definiendo un formato de almacenamiento , lo que significa que sería bueno aclarar exactamente cómo Se espera que muchos bytes tengan cada campo.


¿Está bien tener múltiples estructuras anónimas dentro de la estructura principal?

si. Pero creo que es confuso a veces tener un camino de acceso multinivel y, a veces, no. Por ejemplo, accede a un campo como

  getElementsByClassName9  

pero otro como

  insertAdjacentHTML0  

¿Por qué no es insertAdjacentHTML1 ? Y por qué insertAdjacentHTML2 no insertAdjacentHTML3 o al menos 99887776655443354 , dado que está abreviando insertAdjacentHTML5 a insertAdjacentHTML6 ¿En cada otra línea del programa?

(de nuevo, Personalmente I escribiría insertAdjacentHTML7 y especialmente 99887776655443358 ; abreviándolos como insertAdjacentHTML9 y < CÓDIGO> let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 0655443360 es más confuso que IMHO. Con let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 1 Debe preocuparse por si la abreviatura adecuada es 998877766554433622 o let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 3 (He visto a ambos, especialmente ya que let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 4 es el mismo número de caracteres que let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 5 y let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 6 y let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 7 ). He nunca visto let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 8 abreviado como let link = function(element, id, title) { element.querySelector(".post-menu").insertAdjacentHTML('beforeend', ` <span> <a class="userscript-timeline" title="timeline for this ${title}" href="/posts/${id}/timeline">timeline</a> </span> `); }; let question = document.getElementById("question"); if (question) { link(question, question.dataset.questionid, "question"); } for (let answer of document.getElementsByClassName("answer")) { link(answer, answer.dataset.answerid, "answer"); } 9 (Aunque he visto if valid(distances, mid, k): h = mid - 0.1 # Now the best value is lost. 70 y if valid(distances, mid, k): h = mid - 0.1 # Now the best value is lost. 1 ).


  if valid(distances, mid, k):     h = mid - 0.1 # Now the best value is lost. 2  

No explica qué funciones son "las siguientes funciones". Además, podría ser más apropiado escribir esto como

  if valid(distances, mid, k):     h = mid - 0.1 # Now the best value is lost. 3  

para que pueda ser especificado por el usuario en la hora de construcción como E.G. if valid(distances, mid, k): h = mid - 0.1 # Now the best value is lost. 4 .


  if valid(distances, mid, k):     h = mid - 0.1 # Now the best value is lost. 5  

Sospecho de este código. HY ¿Está bien que el número de paso sea un 99887776655443376 (que es lo que es)? Como mínimo, debe reemplazar la palabra if valid(distances, mid, k): h = mid - 0.1 # Now the best value is lost. 8 con if valid(distances, mid, k): h = mid - 0.1 # Now the best value is lost. 9 aquí para mayor claridad. Pero también, mantener este código será una pesadilla sin una suite de prueba exhaustiva Muy . Por ejemplo, tendrás que tener mucho cuidado nunca usar if valid(distances, mid, k): best_so_far = mid h = mid - 0.1 ... return best_so_far 0 if valid(distances, mid, k): best_so_far = mid h = mid - 0.1 ... return best_so_far 11 con un número de paso, ya que los que no funcionan con if valid(distances, mid, k): best_so_far = mid h = mid - 0.1 ... return best_so_far 2 .

¿Por qué no solo dejar que el número del paso sea if valid(distances, mid, k): best_so_far = mid h = mid - 0.1 ... return best_so_far 3 y hágalo con él?


Por cierto, no sé cuál es el inicialismo if valid(distances, mid, k): best_so_far = mid h = mid - 0.1 ... return best_so_far 4 , pero debe tener en cuenta que a un hablante nativo de inglés, tiene un parecido divertido a "OMFG". :)

 
typedef unsigned long tick_t; 

we are arguing with friend about that - he thinks that we should [...] make tick_t just 64bits [...] but I want to make this code run fast on 16bit microcontrollers too

Personally, I would never use the long or unsigned long types in production code, because they vary in size even between different 32-bit platforms. On some platforms, int is 32 and long is 32 and long long is 64; on other platforms, int is 32 and long is 64 and long long is 64. Rather than play a guessing game with my program's future portability requirements, I would write explicitly

#if OMFW_USE_32_BIT_TIMES typedef uint32_t tick_t; #else typedef uint64_t tick_t; #endif // OMFW_USE_32_BIT_TIMES 

This is much more typing, but it conveys the intended semantics unambiguously: that is, by default I want 64-bit tick_t, but I also want to give the builder the option of using 32-bit tick_t in case it's helpful to him. In fact, this lets the builder pass -DOMFW_USE_32_BIT_TIMES on his 32-bit platform, or -DOMFW_USE_32_BIT_TIMES=0 on his 16-bit platform if he really wants to.


Do they have correct naming? I added _t prefix as uintx_t have.

FYI, that's a _t suffix (appended), not a prefix (prepended).

This is fine; but you are courting collisions with the standard library. For example, the standard library already defines time_t and off_t; if you get in the habit of using the exact same naming conventions as the standard library, then you might one day run into trouble when you need a name for an entity representing a "time" type or an "offset" type.

Therefore I would recommend at least namespacing the identifiers as omfw_time_t, omfw_offset_t, etc. (Also notice that I wrote out "offset" instead of "off", because it's clearer and the compiler certainly won't care that we're being a little more verbose.)


int pinSignal; int pinDirection; 

Surely pinDirection should be a bool. Also, in all cases where you're using int, I suggest being explicit about the expected range of the value: is an int16_t good enough? Could we get away with int8_t? I would definitely use unadorned int for computations, but here you're defining a storage format, which means it would be nice to clarify exactly how many bytes each field is expected to have.


Is it OK to have multiple anonymous structs inside main struct?

Yes. But I do think it's confusing to sometimes have a multi-level access path and sometimes not. For example, you access one field as

myMotor.cur.speed 

but another as

myMotor.pos.curDirection 

Why is it not myMotor.cur.direction? And why is myMotor.rt.currentStep not myMotor.cur.step or at least myMotor.rt.curStep, given that you're abbreviating current to cur on every other line of the program?

(Again, personally I would write out current and especially target; abbreviating them as cur and tar is more confusing than helpful IMHO. With current you have to worry about whether the proper abbreviation is cur or curr (I've seen both, particularly since curr is the same number of characters as prev and next and last). I've never seen target abbreviated as tar (although I have seen targ and tgt).


/**  * num_t: Floating point number used to calculate   * Please note, if you want [to] use fixed point or any custom  * number, you should use operator over[l]oading feature of C++  * and also implement following functions for it in omfw/math.h  */ typedef double num_t; 

You don't explain which functions are "the following functions." Also, it might be more appropriate to write this as

#ifndef OMFW_NUM_T #define OMFW_NUM_T double #endif // OMFW_NUM_T  typedef OMFW_NUM_T num_t; 

so that it can be specified by the user at build time as e.g. -DOMFW_NUM_T=float.


/**  * step_t: Hold current step value  * Only increased / decreased by one  * May be signed, unsigned, floating point  */ #ifdef OMFW_PRECOMPUTE_TABLE typedef uint32_t step_t; #else typedef num_t step_t; #endif 

I'm suspicious of this code. Why is it okay for the step number to be a double (which is what num_t is)? At the very least, you should replace the word num_t with double here for clarity. But also, maintaining this code is going to be a nightmare without a very thorough test suite. For example, you'll have to be very careful never to use ++ or % with a step number, because those don't work with double.

Why not just let the step number be int and be done with it?


Incidentally, I don't know what the initialism omfw_ stands for, but you should be aware that to a native English speaker it bears an amusing resemblance to "omfg". :)

 
 
         
         

Relacionados problema

2  Formateo de un precio en SWIFT usando una extensión vs. una clase  ( Formatting a price in swift using an extension vs a class ) 
Tengo un precio como un Double , que debería formatearlo como un String . ¿Debo usar una extensión en lugar de clase clásica para encapsular "Formater", "...

4  Reemplazo de cadenas de espacios en blanco por pestañas y espacios en blanco para lograr el mismo espaciado  ( Replacing strings of blanks by tabs and blanks to achieve same spacing ) 
#include <stdio.h> #define MAXLINE 1000 /* Maximum length of a line */ #define TABSTOP 4 /* Length of tabstop */ int getLine(char line[], int limi...

3  Proveedor de formato extensible  ( Extendable format provider ) 
Necesitaba una Mejor Opciones de formato de cadena como public class JavaClass { ... public List<GenericEntry> getAllGenericEntries() { r...

5  Persiste los datos por serializando / deserializando objetos que se envían a ella  ( Persist data by serializing deserializing objects that are sent to it ) 
He creado la siguiente clase para persistir los datos por serializando / deserializando objetos que se envían a él. Me gustaría saber si hay una mejor manera ...

3  Número Pirámide en Java  ( Number pyramid in java ) 
La función func(int m,int n) Salidas (para M = 3, N = 5): 3 34 345 34 3 Se me ocurrió este código: void func(int m,int n) { for(int i=1;i<n-...

1  Ejercicio: limpiar y formatear un número de teléfono en Clojure  ( Exercism clean and format a phone number in clojure ) 
Declaración de problemas Número de teléfono Escriba un programa que limpie los números de teléfono ingresados ​​por el usuario para que puedan ser envi...

8  Inventario de juegos de fantasía - CH. 5 Automatizar las cosas aburridas  ( Fantasy game inventory ch 5 automate the boring stuff ) 
Aquí hay un ejercicio de práctica: inventario de juegos de fantasía $ - $ estás creando un videojuego de fantasía. La estructura de datos para mode...

11  Imprimiendo un calendario por un mes basado en la entrada del usuario  ( Printing a calendar for a month based on user input ) 
Tengo un código de código largo que tiene muchos puntos de repetición. Estoy seguro de que no toma esta cantidad de código para crear un calendario simple, pe...

4  Manera más corta posible de imprimir una tabla específica  ( Shortest possible way of printing a specific board ) 
Estoy tratando de imprimir una tabla exactamente como esta con la matriz multidimensional. char score[10][10] = {' '}; a b c d e f g h i j +-...

4  Resaltador de sintaxis para HTML y PHP  ( Syntax highlighter for html and php ) 
He creado una aplicación JavaScript para resaltar la sintaxis de HTML y PHP. Sé que muchos resaltadores de sintaxis están disponibles hoy en día, acabo de cre...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos