- Good Coding Practice With C structs?
- typedef struct {
- float sp;
- float K; // interactive form - for display only
- float Ti; // values are based in seconds
- float Td;
- } pid_data_t;
- pid_data_t = pid_data;
- pid_data.K = 10; // no good! changing K should be done via a function
- int8_t pid_set_pid_params(float new_K_dash, float new_Ti_dash,
- float new_Td_dash)
- {
- … // perform lots of things
- pid_data->K = new_K_dash;
- pid_data->Ti = new_Ti_dash;
- pid_data->Td = new_Td_dash;
- }
- // library.h
- typedef struct data_t * data_handle;
- data_handle create_data();
- void free_data(data_handle);
- #include "library.h"
- struct data_t
- {
- /* ... */
- };
- data_handle create_data() { return malloc(sizeof(struct data_t)); }
- void free_data(data_handle h) { free(h); }
- /* etc. etc. */
- typedef struct Foo {
- /* public elements */
- } Foo;
- Foo *new_Foo(void);
- void Foo_something_opaque(Foo* foo);
- #include "foo.h"
- typedef struct Private_Foo_ {
- struct Foo foo;
- /* private elements */
- } Private_Foo_;
- Foo *new_Foo(void)
- {
- Private_Foo_ *foo = malloc(sizeof(Private_Foo_));
- /* initialize private and public elements */
- return (Foo*) foo;
- }
- void Foo_something_opaque(Foo *foo)
- {
- Private_Foo_ *priv_foo = (Private_Foo_*) foo;
- /* do something */
- }
- typedef struct Private_Foo_ {
- /* private elements */
- } Private_Foo_;
- static size_t Private_Foo_sizeof(void) { return sizeof(Private_Foo_); }
- #include
- #define FOO_SIZEOF_PRIVATE_ELEMENTS <generated by preconfigure step>
- typedef struct Foo_ {
- /* public elements */
- char reserved[FOO_SIZEOF_PRIVATE_ELEMENTS];
- } Foo;
- Foo *new_Foo(void);
- void Foo_something_opaque(Foo* foo);
- #include "foo.h"
- #include "foo_private.h"
- Foo *new_Foo(void)
- {
- Foo *foo = malloc(sizeof(Foo));
- /* initialize private and public elements */
- return (Foo*) foo;
- }
- void Foo_something_opaque(Foo *foo)
- {
- Private_Foo_ *priv_foo = (Private_Foo_*) foo.reserved;
- /* do something */
- }
- Array *array_alloc(size_t sizeofElement, unsigned int elements);
- void *array_at(Array *array, unsigned int index);
- /* and all the other functions expected of arrays */
- Array *Foo_array(unsigned int count);
- #ifndef __MY_LIBRARY__
- #define __MY_LIBRARY__
- typedef void MiObject;
- MyObject* newMyObject();
- void destroyMyObject(MyObject*)
- int setMyObjectProperty1(MyObject*,someDataType1*);
- /*Return a pointer to the data/object, classic pass by value */
- someDataType1* getMyObjectProperty2Style1(MyObject*);
- int setMyObjectProperty2(MyObject*,someDataType2*);
- /* The data/object is passed through reference */
- int getMyObjectProperty2Style2(MyObject*,someDataType2**);
- /* Some more functions here */
- #endif
- struct _MyHiddenDataType{
- int a;
- char* b;
- ..
- ..
- };
- MyObject* newMyObject(){
- struct _MyHiddenData* newData = (struct _MyHiddenData*)malloc(sizeof(struct _MyHiddenData);
- //check null, etc
- //initialize data, etc
- return (MyObject*)newData;
- }
- int setMyObjectProperty1(MyObject* object,someDataType1* somedata){
- struct _MyHiddenData* data = (struct _MyHiddenData*)object;
- //check for nulls, and process somedata
- data->somePropery=somedata;
- }
- someDataType1* getMyObjectProperty2Style1(MyObject*){
- struct _MyHiddenData* data = (struct _MyHiddenData*)object;
- //check for nulls, and process somedata
- return data->someProperty;
- }
- /* Similar code for the rest */